У меня есть правило .htaccess, которое передает запросы для / category / category-slug / to category.php . Однако, когда я проверяю супер-глобальный $_SERVER
, я получаю эту запись:
Array ( [PATH_TRANSLATED] => redirect:// )
Что это? Я никогда не видел перенаправления: // раньше.
Это relavant .htaccess правило:
RewriteRule ^category/([^/]+)/?(.*) /category.php?cat=$1&page=$2 [L,QSA]
В результате я не получаю $_GET['cat']
или $_GET['page']
заполненный в моем скрипте, поскольку он, кажется, исходит из перенаправления и не имеет просто переписанного запроса. Что происходит?
Я нашел отчет об ошибке Apache (40781) о том, что похоже на ту же проблему. Процитировать комментарий Боба Ионеску :
«Проблема заключается в том, что подзапрос с uri = path_info основного запроса (для получения path_translated, т. Е. Просмотра физического пути для path_info) снова обращается к RewriteRule в контексте контекста и соответствует, следовательно, никакого физического пути.
Почему это не происходит в Apache 2.0? Ответ прост: mod_rewrite не работает в подзапросах в контексте для каждого каталога до версии 2.1. Флаг NS предотвращает обработку RewriteRules в подзапросах. "
В комментарии говорится, что вы должны решить эту проблему, включив флаг [NS]
в RewriteRule
s, если вы явно не хотите, чтобы они также применялись к подзапросам.
PATH_TRANSLATED
в $_SERVER
– это переменная среды вашего сервера, которая импортируется PHP в $_SERVER
следуя некоторым стандартным правилам. Таким образом, переменная среды аналогична, если ее не идентифицировать идентично.
Только по имени переменной окружения нельзя сказать, что именно установило это значение, однако в контексте вашего вопроса предполагается, что он был установлен веб-сервером Aapache HTTPD.
В документации по PHP говорится следующее:
Предыдущее поведение PHP состояло в том, чтобы установить
PATH_TRANSLATED
наSCRIPT_FILENAME
и не проверять, что такое PATH_INFO. [..] Вы должны исправить свои сценарии, чтобы использоватьSCRIPT_FILENAME
а неPATH_TRANSLATED
.
Также смотрите $_SERVER
с немного другой записью:
Путь файловой системы (не основанный на документе root-) к текущему скрипту после того, как сервер выполнил какое-либо сопоставление виртуальной реальности.
Примечание. Начиная с PHP 4.3.2, PATH_TRANSLATED больше не устанавливается неявно под Apache 2 SAPI, в отличие от ситуации в Apache 1, где оно установлено на то же значение, что и переменная сервера SCRIPT_FILENAME, когда она не заполняется Apache. Это изменение было сделано для соответствия спецификации CGI, что PATH_TRANSLATED должен существовать только в случае определения PATH_INFO. Пользователи Apache 2 могут использовать AcceptPathInfo = Внутри httpd.conf для определения PATH_INFO.
Все переменные $_SERVER
считываются из среды. В случае Apache + mod_php эта среда определяется сервером Apache.
Честно говоря, я либо не видел redirect://
до сих пор. Вы уверены, что ваш запрос соответствует этому правилу перезаписи, а не другому?
Я думаю, что mod_rewrite – это место, где вы должны искать ошибку.
Вы можете отладить, что делает mod_rewrite, включив журналы