2012-02-06 4 views
2

У меня есть этот маленький файл .htaccess:Доступ к переменным окружения, установленные с помощью mod_rewrite в PHP

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

направлять все запросы на мой сценарий URL маршрутизации. Он отлично работает, и я могу получить доступ к запрошенному URL-адресу в urlroute.php как $_GET['q'].

Я устанавливаю переменные окружения myvariable с помощью mod_rewrite я могу получить к нему доступ в urlroute.php в $_SERVER['myvariable']. Я не могу получить к нему доступ, используя $_ENV['myvariable'], который кажется странным. Может ли кто-нибудь объяснить причину?

Насколько мне известно, mod_redirect добавит REDIRECT_ к именам переменных среды при выполнении перенаправления (что всегда в моем случае). Но для меня доступны как $_SERVER['myvariable'], так и $_SERVER['REDIRECT_myvariable']. Зачем?

ответ

2

См. 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 контекст, но являются ли они доступны в ОКРУЖАЮЩАЯ СРЕДА зависит от того, как реализуется PHP, например Apache + mod_php, Apache + mod_suphp, Apache + mod_fcgi, IIS, ...

+0

+1 для хорошего ответа, однако, я думаю, вы имели в виду 'RewriteCond' вместо' RedirectCond'. – anubhava

+0

@anubhava, вот что я называю «mindfart». Сожалею. конечно ты прав. Я отредактировал ответ – TerryE

Смежные вопросы