.htaccess 中取决于域的条件:SetEnvIf 和 IfDefine?

.htaccess 中取决于域的条件:SetEnvIf 和 IfDefine?

我想在 .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$/">
:

相关内容