2013-04-25 4 views
0

У меня есть следующие правила в файле HtaccessКак тег среда E работает в .htaccess мод переписывают

RewriteEngine On 
RewriteRule mytest.php test.php 
RewriteCond %{QUERY_STRING} !done 
RewriteRule (.*) $1?done [E=TEST:itworks] 

Файл test.php просто

<?php 
echo "TEST = " . getenv('TEST'); 
?> 

Когда я ввожу запрос URI test.php, определяется переменная среды TEST, и она перекликается с «Test = itworks». Однако, когда я вхожу в запрос uri mytest.php, он также переходит к test.php, но переменная среды TEST не определена, и она повторяет «Test =».

Это ожидаемое поведение? Если это ошибка в моей среде, неважно. В противном случае, возможно, можно было бы использовать этот простой случай, чтобы объяснить мне, как это работает.

ответ

0

Когда вы проходите через mytest.php, есть дополнительный раунд через mod_rewrite.

Затем переменные окружения имеют префикс REDIRECT_. Если вы проверить REDIRECT_TEST, вы увидите требуемый выход

<?php 
echo "TEST = " . getenv('TEST') . "/" . getenv('REDIRECT_TEST'); 

См Available Variables для некоторых деталей.

+0

Пожалуйста, может кто-нибудь объяснить этот «дополнительный раунд»? Зачем? Как второй RewriteRule знает, что первый выстрел перед ним вызывает дополнительный раунд? Это дополнительный раунд через весь файл .htaccess или только последний RewriteRule. Мне не хватает чего-то действительно фундаментального. – Chris

+1

Существует технический документ о том, как Apache [обрабатывает правила] (http://httpd.apache.org/docs/current/rewrite/tech.html#InternalRuleset). Вы можете видеть на изображении, как внутренний переписывать будет возвращен в Apache для второго раунда или даже третьего раунда, пока URI не будет изменен правилами. –

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