【问题标题】:RewriteCond with SetEnv使用 SetEnv 重写Cond
【发布时间】:2013-10-14 14:37:06
【问题描述】:

在我的.htaccess我设置:

SetEnv APPLICATION_ENV development

我想检查APPLICATION_ENV是否等于development然后运行app_dev.php,否则app.php

SetEnv APPLICATION_ENV development

RewriteCond %{ENV:APPLICATION_ENV} development
RewriteRule .? %{ENV:BASE}/app_dev.php [L]
RewriteRule .? %{ENV:BASE}/app.php [L]

但是它不起作用 - 总是运行 app.php 脚本。我应该如何解决它?

【问题讨论】:

    标签: apache mod-rewrite


    【解决方案1】:

    由于我必须自己对此进行测试并且只能确认您所写的内容是正确的,因此我开始环顾四周,发现关于SetEnvSetEnvIfRewriteRule 可见性的post。看起来SetEnvRewriteCond 不可见,如果我更改您的示例以使用:

    SetEnvIf APPLICATION_ENV  ^(.*)$ APPLICATION_ENV=development
    

    我实际上得到了你必须加载app_dev.php 的规则。您也可以使用RewriteRule 设置变量:

    RewriteRule .* - [E=APPLICATION_ENV:development,NE]
    

    但是,看起来 SetEnv 无法使用(在 Apache 2.2.22 上测试)。

    编辑
    正如 julp 在对这篇文章的评论中指出的那样,这在 Apache 文档部分 Setting Environment Variables 中非常清楚:

    The SetEnv directive runs late during request processing meaning that directives 
    such as SetEnvIf and RewriteCond will not see the variables set with it.
    

    【讨论】:

    • 你说得对,解释在Apache documentation:这个指令[SetEnv]设置的内部环境变量是在大多数早期请求处理指令运行后设置的,例如访问控制和URI-到文件名映射。如果您设置的环境变量是作为早期处理阶段的输入,例如 RewriteRule 指令,您应该使用 SetEnvIf 设置环境变量。
    • 我已经在 apache2 上测试过这个问题,没有比 OP 更好的结果。
    • @julp 啊,谢谢,我不明白我在阅读它时怎么会错过它。很高兴在官方文档中进行解释。
    • @Qben 感谢您的回答。我在我的VirtualConf 定义中设置了SetEnvIf,所以.htaccess 文件可以被推送到生产环境,现在我没有任何黑客攻击了。谢谢 ! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 2020-02-22
    • 2018-12-11
    • 1970-01-01
    • 2023-03-09
    • 2021-08-22
    相关资源
    最近更新 更多