【问题标题】:Accessing environment variables set using mod_rewrite in PHP在 PHP 中访问使用 mod_rewrite 设置的环境变量
【发布时间】:2012-02-06 01:27:07
【问题描述】:

我有这个小 .htaccess 文件:

RewriteEngine on
RewriteRule ^(.*)$ urlroute.php?q=$1 [E=myvariable:'withthisvalue',B,QSA]

将所有请求定向到我的 URL 路由脚本。它工作得很好,我可以在 urlroute.php 中以$_GET['q'] 访问请求的 URL。

我正在使用 mod_rewrite 设置环境变量 myvariable 我可以在 urlroute.php 中以$_SERVER['myvariable'] 的身份访问它。我无法使用 $_ENV['myvariable'] 访问它,这似乎很奇怪。有人可以解释一下可能是什么原因吗?

据我所知,mod_redirect 会在进行重定向时将REDIRECT_ 添加到环境变量名称之前(在我的情况下总是如此)。但对我来说,$_SERVER['myvariable']$_SERVER['REDIRECT_myvariable'] 都可用并设置为相同的内容。为什么?

【问题讨论】:

    标签: php mod-rewrite


    【解决方案1】:

    参见this post 也讨论了相同的功能。重写引擎在每个循环开始时循环评估 .htaccess 文件,引擎将所有环境变量复制到副本 REDIRECT_* 中。因此,如果 .htaccess 文件的解析需要 3 个循环,那么您还将获得 REDIRECT_REDIRECT_* 文件,依此类推。

    Apache 2.3 包含一个新的 [E] 标志,但您可以使用此功能在早期版本中实现相同功能:

    RewriteCond %{ENV:REDIRECT_END} =1
    RewriteRule ^   -  [L]   
    
    # other rules
    
    ...
    
    RewriteRule somepattern  somesubst   [L,E=END:1]
    

    AFAIK,这些变量将在 SERVER 上下文中可用,但它们是否在 ENVIRONMENT 中可用取决于 PHP 的实现方式,例如Apache+mod_php, Apache+mod_suphp, Apache+mod_fcgi, IIS, ...

    【讨论】:

    • +1 以获得好的答案,但我认为您的意思是 RewriteCond 而不是 RedirectCond
    • @anubhava,这就是我所说的“头脑法”。对不起。你当然是对的。我已经编辑了答案
    猜你喜欢
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多