Мой текущий хост использует FastCGI для настройки PHP, и это, по-видимому, вызывает некоторые проблемы, когда директива mod_rewrite перенаправляет на URL-адрес с частью PATH_INFO. Например, возникают проблемы при использовании следующего:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1
При использовании вышеупомянутого перехода к перезаписанному URL-адресу появляется сообщение об ошибке «Не указан входной файл» от PHP, что означает, что PHP не передал файл для синтаксического анализа надлежащим образом.
Я смог узнать из веб-поиска, что эта проблема возникает только тогда, когда PHP запускается под FastCGI, но я не смог найти прямого ответа на это, так это Зачем. Вместо этого в сети, по-видимому, полно людей, которые вслепую меняют перезапись, чтобы использовать строку запроса (например, изменяя index.php/$1
часть вышеизложенного index.php?/$1
- Обратите внимание ?
) без реального понимания основной проблемы.
Я знаю, что проблема возникает как часть или в результате процесса перезаписи, и что это не проблема того, что установки FastCGI вообще не могут обрабатывать URL-адреса PATH_INFO, поскольку $_SERVER['PATH_INFO']
переменная заполняется соответствующим образом, когда я перехожу непосредственно к www.example.com/index.php/foobar
без прохождения процесса перезаписи.
Не мог бы кто-нибудь объяснить, что происходит во время перезаписи и последующей передачи PHP, что вызывает сбой?
Я нашел две разные информации об этом в документах PHP.
Первый находится на странице php.ini о параметре cgi.fix_pathinfo.
cgi.fix_pathinfo логический
Обеспечивает реальную поддержку PATH_INFO / PATH_TRANSLATED для CGI. Предыдущее поведение PHP заключалось в установке PATH_TRANSLATED в SCRIPT_FILENAME и не проверять, что такое PATH_INFO. Для получения дополнительной информации о PATH_INFO см. Спецификации CGI. Установка этого параметра в 1 заставит PHP CGI исправить свои пути в соответствии со спецификацией. Установка нуля заставляет PHP вести себя как раньше. По умолчанию он включен. Вы должны исправить свои сценарии, чтобы использовать SCRIPT_FILENAME, а не PATH_TRANSLATED. http://php.net/manual/en/ini.core.php
И второй находится на странице переменных сервера. Это связано с предыдущей информацией.
"PATH_TRANSLATED"
Путь к текущему скрипту, основанный на файловой системе (а не на корне документа), после того, как сервер выполнил любое сопоставление виртуального и реального.
Примечание. Начиная с PHP 4.3.2, PATH_TRANSLATED больше не устанавливается неявно в SAPI Apache 2, в отличие от ситуации в Apache 1, где он имеет то же значение, что и серверная переменная SCRIPT_FILENAME, когда она не заполняется Apache. Это изменение было внесено в соответствии со спецификацией CGI, согласно которой PATH_TRANSLATED должен существовать только в том случае, если определен PATH_INFO. Пользователи Apache 2 могут использовать AcceptPathInfo = On внутри httpd.conf для определения PATH_INFO. http://php.net/manual/en/reserved.variables.server.php
Вы можете попробовать отключить MultiViews в apache conf. Это также может быть причиной этого.