.htaccess条件,环境变量未求值

shstlldc  于 2023-06-24  发布在  其他
关注(0)|答案(1)|浏览(156)

基本设置如下:如果域以. www.example.com结尾,则为暂存环境staging.com it is the staging environment

  • foobar.com.staging.com --> staging environment
  • foobar.com --> live environment

我有以下. htaccess代码:

  • 所有必要的Apache模块都已启用。
  • 环境变量(第1 - 5行)设置正确(至少在PHP脚本中通过getenv()检查它们时是这样)。
  • 基本身份验证本身正在按预期工作
  • 如果我删除Allow/Require块周围的条件,它们也会按预期工作 conditions around the Allow/Require blocks those also work as expected
  • 如果我让条件保持在下面写的那样,允许/要求就不会被评估。 conditions just as they are written below the Allow/Require are simply not being evaluated.

知道我哪里做错了吗

SetEnvIfNoCase Host ^([a-zA-Z-.]*)\.staging\.com$ staging_env=true
SetEnvIfNoCase Host ^([a-zA-Z-.]*)(?<!\.staging\.com)$ live_env=true
SetEnvIfNoCase Request_URI "^/export" export_folder=true
SetEnvIf Remote_Addr ^1\.2\.3\.4$ authorized_ip=true
SetEnvIf Remote_Addr "^2\.3\.4\.[0-9]+$" authorized_ip=true

AuthUserFile /home/foobar/public_html/.htpasswd
AuthName "Password Protected"
AuthType Basic

Order Deny,Allow
Satisfy any
Deny from all

<If "%{ENV:export_folder} == 'true'">
    Allow from env=authorized_ip
</If>
<If "%{ENV:export_folder} != 'true' && %{ENV:live_env} == 'true'">
    Allow from env=live_env
</If>
<If "%{ENV:staging_env} == 'true'">
    Require valid-user
    Allow from env=authorized_ip
</If>

感谢@covener,我设法让它工作。我的最终解决方案是这样的:

SetEnvIfNoCase Host ^([a-zA-Z-.]*)\.staging\.com$ environment=staging
SetEnvIfNoCase Host ^([a-zA-Z-.]*)(?<!\.staging\.com)$ environment=production
SetEnvIfNoCase Request_URI "^/export" export_folder=true
SetEnvIf Remote_Addr ^1\.2\.3\.4$ authorized_ip=true
SetEnvIf Remote_Addr "^2\.3\.4\.[0-9]+$" authorized_ip=true

AuthUserFile /home/foobar/public_html/.htpasswd
AuthName "Password Protected"
AuthType Basic

<RequireAny>
    <RequireAll>
        Require expr %{ENV:export_folder} == 'true'
        Require expr %{ENV:authorized_ip} == 'true'
    </RequireAll>
    <RequireAll>
        Require expr %{ENV:export_folder} != 'true'
        Require expr %{ENV:environment} == 'production'
    </RequireAll>
    <RequireAll>
        Require expr %{ENV:environment} == 'staging'
        <RequireAny>
            Require expr %{ENV:authorized_ip} == 'true'
            Require expr %{REMOTE_USER} != ''
        </RequireAny>
    </RequireAll>
</RequireAny>
ki1q1bka

ki1q1bka1#

我认为这里的问题是<if>部分是一个新的配置部分,所以任何mod_authz_compat的使用都是替换,而不是合并,在htaccess的其余部分,包括满足。
我个人会清除所有mod_access_compat指令,并在需要的地方使用require和表达式,而不使用<if>部分。<if>有各种各样令人惊讶的效果,而作为指令参数的表达式要直观得多。
但复制满足可能就足够了。

相关问题