我正在尝试根据环境变量的存在将配置文件包含在Apache 2.4 <VirtualHost>
中。
在VirtualHost
声明中,我将VIEWMODE
环境变量设置为:
Define virtualhost_config "${virtualhost_path}/conf/virtualhost.conf"
<VirtualHost *:80>
SetEnv VIEWMODE demo
Include "${virtualhost_config}"
</VirtualHost>
在包含的配置文件中,我现在在<Directory>
块内有条件:
<If "env('VIEWMODE') == 'demo'">
RewriteRule (.*) http://www.apple.com/ [L,R=302]
</If>
然而,我似乎无法让这个工作。条件RewriteRule
被忽略。
我错过了什么?
答案 0 :(得分:0)
在运行大多数早期请求处理指令后,此指令设置的内部环境变量设置为,例如访问控制和URI到文件名映射。如果您设置的环境变量是作为
RewriteRule
指令的早期处理阶段的输入,则应该使用SetEnvIf
设置环境变量。
Apache Expresions文档的函数部分中的note about environment variables也很有用:
环境变量排序
在
<If>
条件下查找环境变量时,考虑发生此解决方案的请求处理的早期程度非常重要。作为指导原则,在虚拟主机上下文(目录,位置,htaccess)之外定义的任何指令都不太可能有机会执行。虚拟主机范围中的SetEnvIf
是在此解决方案之前运行的一个指令在
reqenv
之外使用<If>
时,解析通常会在稍后发生,但确切的时间取决于表达式在其中使用的指令。
所以你需要使用SetEnvIf
因为SetEnv
没有尽快处理,并且在我测试时为我修复了它。类似的东西:
Define virtualhost_config "${virtualhost_path}/conf/virtualhost.conf"
<VirtualHost *:80>
SetEnvIf Request_URI ^ VIEWMODE=demo
Include "${virtualhost_config}"
</VirtualHost>
答案 1 :(得分:0)
我通过设置一个Apache变量解决了这个问题,然后该变量同时提供了SetEnv
指令以及<If>
块。遗憾的是,<If>
块本身似乎会导致其中指令的处理顺序出现问题(例如ServerAlias not allowed here
),但<IfDefine>
没有出现此问题(使用<IfDefine>
只对我有用,因为VIEWMODE
是二进制的)。最终解决方案看起来像这样:
Define environment production
Define viewmode demo
<VirtualHost *:80>
SetEnv ENVIRONMENT ${environment}
<IfDefine viewmode>
SetEnv VIEWMODE ${viewmode}
Include "${virtualhost_path}/conf/demo-configuration.conf"
</IfDefine>
</VirtualHost>
UnDefine environment
UnDefine viewmode
一个重要的警告是Apache变量是全局,因此如果后续虚拟主机中可能使用相同的变量,请确保在每个配置结束时UnDefine
。 / p>