如何使用 SetEnvIf 设置基于 Http Host 的变量?

qod*_*nja 13 apache-2.2

我正在尝试在 Apache 上设置一个变量

ENV=DEV 如果 http 主机是开发 URL

或者

ENV=PRD 如果http主机是prd URL

然后使用 $_SERVER['ENV'] 创建一些逻辑分支

到目前为止,这些都不适合我,我们确实安装了 setenvif 模块

SetEnvIfNoCase Referer
SetEnvIfNoCase Remote_Host
Run Code Online (Sandbox Code Playgroud)

这样做的正确方法是什么?

lar*_*sks 17

快速浏览一下文档

SetEnvIf 指令根据请求的属性定义环境变量。第一个参数中指定的属性可以是以下三项之一:

HTTP 请求标头字段(有关这些的更多信息,请参阅 RFC2616);例如:Host、User-Agent、Referer 和 Accept-Language。正则表达式可用于指定一组请求标头。

因此,当然可以使环境变量以Host标头为条件。看起来您正在尝试使用RefererRemote_Host标头,这两者都不是您想要的(尽管理论上在大多数情况下Referer应该包含Host标头的值)。 Remote_Host将是发出请求的客户端的主机名,这根本不是您想要的(并且在大多数配置中根本不可用,因为出于性能原因通常关闭 DNS 查找)。

尝试这样的事情:

SetEnvIf Host "www-dev\.example\.com" ENV=DEV
SetEnvIf Host "www-production\.example\.com" ENV=PRD
Run Code Online (Sandbox Code Playgroud)

...然后使用 $_SERVER['ENV'] 创建一些逻辑分支

但还要注意,您可以Host直接在 PHP 中直接引用标头的值,而无需通过这个诡计;$_SERVER['HTTP_HOST']将有你想要的。