У меня есть правило .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, включив журналы