Apache VirtualHost基于环境变量的条件

时间:2017-06-13 02:04:10

标签: apache mod-rewrite apache2.4

我正在尝试根据环境变量的存在将配置文件包含在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被忽略。

我错过了什么?

2 个答案:

答案 0 :(得分:0)

请参阅documentation for SetEnv

  

在运行大多数早期请求处理指令后,此指令设置的内部环境变量设置为,例如访问控制和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>