在PHP中使用mod_rewrite访问环境变量集


Accessing environment variables set using mod_rewrite in PHP

我有一个.htaccess小文件:

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

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

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

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

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

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

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

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