Что такое перенаправление: // в PATH_TRANSLATED?

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