基于环境变量的Apache VirtualHost条件
基于环境变量的存在,我试图在Apache2.4基于环境变量的Apache VirtualHost条件,apache,mod-rewrite,apache2.4,Apache,Mod Rewrite,Apache2.4,基于环境变量的存在,我试图在Apache2.4中包含一个配置文件 在VirtualHost声明中,我将VIEWMODE环境变量设置为: Define virtualhost_config "${virtualhost_path}/conf/virtualhost.conf" <VirtualHost *:80> SetEnv VIEWMODE demo Include "${virtualhost_config}" </VirtualHost&g
中包含一个配置文件
在VirtualHost
声明中,我将VIEWMODE
环境变量设置为:
Define virtualhost_config "${virtualhost_path}/conf/virtualhost.conf"
<VirtualHost *:80>
SetEnv VIEWMODE demo
Include "${virtualhost_config}"
</VirtualHost>
Define virtualhost_config“${virtualhost_path}/conf/virtualhost.conf”
SetEnv视图模式演示
包括“${virtualhost_config}”
在包含的配置文件中,我现在在
块中具有以下条件:
<If "env('VIEWMODE') == 'demo'">
RewriteRule (.*) http://www.apple.com/ [L,R=302]
</If>
重写规则(.*)http://www.apple.com/ [L,R=302]
然而,我似乎无法让这个工作。忽略条件重写规则
我遗漏了什么?请参阅:
此指令设置的内部环境变量是在运行大多数早期请求处理指令之后设置的,例如访问控制和URI到文件名的映射。如果要设置的环境变量是作为此早期处理阶段的输入,如RewriteRule
指令,则应改为使用setenif
设置环境变量
Apache Expresions文档中的函数部分也很有趣:
环境变量排序
当环境变量在<代码> <代码>条件下查找时,重要的是要考虑在请求处理过程中,这种解决方案发生得多么早。作为指导原则,在虚拟主机上下文(目录、位置、htaccess)之外定义的任何指令都不可能有机会执行<虚拟主机作用域中的code>setenif是在此解析之前运行的一条指令
当在
之外使用reqenv
时,解析通常会在稍后出现,但确切的时间取决于表达式所使用的指令
因此,您需要使用,因为SetEnv
处理得不够快,这在我测试时为我修复了它。比如:
Define virtualhost_config "${virtualhost_path}/conf/virtualhost.conf"
<VirtualHost *:80>
SetEnvIf Request_URI ^ VIEWMODE=demo
Include "${virtualhost_config}"
</VirtualHost>
Define virtualhost_config“${virtualhost_path}/conf/virtualhost.conf”
SetEnvIf请求_URI^VIEWMODE=demo
包括“${virtualhost_config}”
请参阅:
此指令设置的内部环境变量是在运行大多数早期请求处理指令之后设置的,例如访问控制和URI到文件名的映射。如果要设置的环境变量是作为此早期处理阶段的输入,如RewriteRule
指令,则应改为使用setenif
设置环境变量
Apache Expresions文档中的函数部分也很有趣:
环境变量排序
当环境变量在<代码> <代码>条件下查找时,重要的是要考虑在请求处理过程中,这种解决方案发生得多么早。作为指导原则,在虚拟主机上下文(目录、位置、htaccess)之外定义的任何指令都不可能有机会执行<虚拟主机作用域中的code>setenif是在此解析之前运行的一条指令
当在
之外使用reqenv
时,解析通常会在稍后出现,但确切的时间取决于表达式所使用的指令
因此,您需要使用,因为SetEnv
处理得不够快,这在我测试时为我修复了它。比如:
Define virtualhost_config "${virtualhost_path}/conf/virtualhost.conf"
<VirtualHost *:80>
SetEnvIf Request_URI ^ VIEWMODE=demo
Include "${virtualhost_config}"
</VirtualHost>
Define virtualhost_config“${virtualhost_path}/conf/virtualhost.conf”
SetEnvIf请求_URI^VIEWMODE=demo
包括“${virtualhost_config}”
我通过设置一个Apache变量解决了这个问题,该变量随后向SetEnv
指令和
块提供数据。不幸的是,
块本身似乎会导致其内部指令的处理顺序出现问题(例如,此处不允许使用ServerAlias
),但
没有这个问题(使用
仅对我有效,因为视图模式
是二进制的)。最终的解决方案如下所示:
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
定义生产环境
定义视图模式演示
SetEnv环境${ENVIRONMENT}
SetEnv VIEWMODE${VIEWMODE}
包括“${virtualhost_path}/conf/demo configuration.conf”
未定义环境
取消定义视图模式
一个重要的警告是,Apache变量是全局变量,因此如果在后续虚拟主机中可能使用相同的变量,请确保在每个配置结束时取消定义它们。我通过设置一个Apache变量解决了这一问题,该变量随后向
SetEnv
指令和
块提供数据。不幸的是,
块本身似乎会导致其内部指令的处理顺序出现问题(例如,此处不允许使用ServerAlias
),但
没有这个问题(使用
仅对我有效,因为视图模式
是二进制的)。最终的解决方案如下所示:
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
定义生产环境
定义视图模式演示
SetEnv环境${ENVIRONMENT}
SetEnv VIEWMODE${VIEWMODE}
包括“${virtualhost_path}/conf/demo configuration.conf”
未定义环境
取消定义视图模式
一个重要的警告是,Apache变量是全局变量,因此如果在后续虚拟主机中可能使用相同的变量,请确保在每个配置的末尾取消定义这些变量。使用重定向302”http://www.apple.com/“
内的如果
,否则,如果没有RewriteEngine在那里,我不确定它是否可以工作。使用Redirect 302“http://www.apple.com/“
在If
中,否则我不确定它在没有重写引擎的情况下是否能工作