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


11

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

ENV = DEV如果http主机是dev URL

要么

如果http主机是prd URL,则ENV = PRD

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

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

SetEnvIfNoCase Referer
SetEnvIfNoCase Remote_Host

什么是正确的方法?

Answers:


15

快速浏览文档

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

HTTP请求标头字段(有关这些的更多信息,请参阅RFC2616);例如:主机,用户代理,引荐来源和接受语言。正则表达式可用于指定一组请求标头。

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

尝试这样的事情:

SetEnvIf Host "www-dev\.example\.com" ENV=DEV
SetEnvIf Host "www-production\.example\.com" ENV=PRD

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

但是还要注意,您可以Host直接在PHP中直接引用标头的值,而无需经历这种情况。$_SERVER['HTTP_HOST']将会完全满足您的需求。


美丽。这使我可以编写自定义规则,以在连接到某些主机(而不是其他主机)时要求输入密码(即,将一个VM克隆到多个Amazon EC2实例时保护登台框,但是不编写自定义Chef食谱)。功能(如果很难搜索)非常有用。
埃里克·L.

1
SetEnvIf文档说是第三个参数是一个正则表达式,不应该在域名点用反斜杠进行转义?还是用双引号引起来的值使Apache将其视为字符串文字?
jakub.g

@ jakub.g是的,它们是正则表达式,应该转义。在这种情况下,由于点匹配任何单个字符,因此"www-dev.example.com"正则表达式还将匹配意外的主机名,例如www-dev-example.com。您将获得预期的比赛以及更多。我现在更新了示例。
马丁·海姆斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.