.htaccess中用mod_rewrite测试环境变量的条件判断失效问题
问题原因及解决方案
核心原因
Apache模块的执行顺序导致SetEnv设置的环境变量在mod_rewrite运行阶段不可用:
mod_env的SetEnv指令在请求处理的后期阶段设置变量;mod_rewrite的RewriteCond/RewriteRule在请求处理的早期阶段执行,此时MY_SITE变量还未被初始化,所以%{ENV:MY_SITE}读取的值为空,条件自然不匹配。
而你用Header指令能输出MY_SITE的值,是因为Header属于后期执行的模块,此时SetEnv设置的变量已经生效。
解决方案
将apache2.conf中的SetEnv替换为SetEnvIf(mod_setenvif模块的指令,执行阶段早于mod_rewrite),这样mod_rewrite就能正确读取到环境变量:
# apache2.conf 中修改为 SetEnvIf Host .* MY_SITE=stage
额外说明
你之前在.htaccess中添加的这段代码其实无效,因为执行时%{ENV:MY_SITE}为空,规则不会匹配,可以直接删除:
RewriteCond %{ENV:MY_SITE} (.+) RewriteRule ^ - [E=MY_SITE:%1]
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

