2017-06-13 73 views
1

基于环境变量的存在,我试图在Apache 2.4 <VirtualHost>中包含一个配置文件。基于环境变量的Apache 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

在'If'里面使用'Redirect 302'http://www.apple.com/“',否则我不确定没有'RewriteEngine On'就可以工作。 – Deadooshka

回答

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> 
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他们在每个月底配置。