我想在 .htaccess 中添加一条规则,根据域名“执行某些操作”(实际上启用 httpauth 用户限制)。
我以为我做到了并且做到了:
<IfModule mod_setenvif.c>
SetEnvIf Host "staging\.(.*)\.ch" HTTPAUTHPROTECT=true
<IfDefine HTTPAUTHPROTECT>
# Do something
# For testing, I used the following line:
# SetEnvIf Host "staging\.(.*)\.ch" CONDITIONMATCHED=conditionmatched
</IfDefine>
</IfModule>
在运行 Litespeed 的服务器上,我以为这是可行的。也许我错了,该<IfDefine HTTPAUTHPROTECT>
部分始终返回 true。在另一台运行 Apache (2.4.54) 的服务器上,无论 ENV 变量设置为何值,它都会一直返回 false。
我阅读SOApache 上
IfDefine
无论如何都无法正常工作。是这样的吗?那么有没有办法实现这样的条件呢?
PS:我不是指重写规则。我想要有条件执行的代码是:
AuthType Basic
AuthName "Login"
AuthUserFile "/path/to/.htpasswd"
Require valid-user
答案1
<IfDefine>
可能不受 LiteSpeed 支持,因此它会被“忽略”并且内容会被无条件执行(错误日志中可能有一些内容)。
在 Apache 上<IfDefine>
检查服务器定义的变量(例如,使用Define <var>
Apache 命令行上的 或-D
标志)。它不检查环境变量,因此表达式总是错误的在 Apache 上,并且内容从未执行。
在 Apache 上,您可以使用 Apache<If>
表达式(需要 Apache 2.4)并检查环境变量。例如:
SetEnvIf Host "^staging\..+\.ch$" HTTPAUTHPROTECT=true
<If "reqenv('HTTPAUTHPROTECT') == 'true'">
AuthType Basic
AuthName "Login"
AuthUserFile "/path/to/.htpasswd"
Require valid-user
</If>
但是,我不能肯定地说这是否适用于 LiteSpeed,因为它在“Apache”支持方面与 Apache 2.2 更为接近。
此外,在 Apache(但不是 LiteSpeed)上,如果在目录上下文(例如.htaccess
),并且您还执行 URL 重写(触发重写引擎的“循环”),那么您可能需要检查表达式REDIRECT_HTTPAUTHPROTECT
中的<If>
。这是因为,在初始阶段设置的任何环境变量都会REDIRECT_
在后续传递中使用前缀重命名。(然而,在 LiteSpeed 上,在早期处理阶段设置的环境变量只是丢失的,未重命名。)
请注意,如果这是您使用环境变量的唯一目的,那么您可以Host
直接在<If>
表达式中检查标题(不需要环境变量)。例如:
<If "%{HTTP_HOST} =~ /^staging\..+\.ch$/">
: