基本设置如下:如果域以. 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>
1条答案
按热度按时间ki1q1bka1#
我认为这里的问题是
<if>
部分是一个新的配置部分,所以任何mod_authz_compat的使用都是替换,而不是合并,在htaccess的其余部分,包括满足。我个人会清除所有mod_access_compat指令,并在需要的地方使用require和表达式,而不使用
<if>
部分。<if>
有各种各样令人惊讶的效果,而作为指令参数的表达式要直观得多。但复制满足可能就足够了。