Пользовательское сообщение 404 при использовании PHP-FPM с Apache

У меня Apache (2.2.22 на Debian), настроенный для обработки файлов PHP через FastCGI:

Приложение SetHandler / x-httpd-php

Приложение Action / x-httpd-php / fcgi-bin / php5-fpm, виртуальный псевдоним

/ fcgi-bin / php5-fpm / fcgi-bin-php5-fpm FastCgiExternalServer

/ fcgi-bin-php5-fpm -socket /var/run/php5-fpm.sock -idle-timeout 600 -pass-header Авторизация

Чтобы показать пользовательскую страницу "Файл не найден" (HTTP 404), настроен в Apache следующим образом:

..

ErrorDocument 404 /pagenotfound.htm

..

На запросы о несуществующих файлах, отличных от PHP, отвечает пользовательский файл 404 pagenotfound.htm. Нет проблем.

Но запросы на несуществующие PHP-файлы отвечают с помощью http-status-header-заголовка "HTTP/1.1 404 Not Found" и содержимого "File not found.", Так что это не моя пользовательская страница ошибки. Проблема!

Журнал ошибок Apache показывает (в последнем случае):

[Сб 21 ноября 14:03:07 2015] [ошибка] [клиент xx.xxx.xx.xx] FastCGI: сервер "/fcgi-bin-php5-fpm" stderr: основной сценарий неизвестен

Как настроить пользовательскую страницу 404 для несуществующих файлов PHP при использовании PHP-FPM?

3 ответа

Установите "ProxyErrorOverride on" в конфигурации глобального сервера или на отдельных виртуальных хостах, см. http://httpd.apache.org/docs/current/mod/mod_proxy.html.

Когда вместо настраиваемой страницы ошибки для несуществующих файлов.php отображается "Файл не найден" (и все другие несуществующие файлы получают правильную настраиваемую страницу ошибки)...

Centos 8, PHP 7.2.11 Файл: /etc/httpd/conf.d/php.conf

Добавьте ProxyErrorOverride On после SetHandler

<FilesMatch \.(php|phar)$>
    SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
    ProxyErrorOverride On
</FilesMatch>

Не уверен, требуется ли, но тогда я сделал:

    systemctl restart httpd

ProxyErrorOverride — лучший вариант, если у вас есть доступ к конфигурации сервера. Но это не работает внутри .htaccessконтекст.

В ErrorDocumentможно запустить с помощью mod_rewrite:

      RewriteEngine On
RewriteCond %{REQUEST_FILENAME} \.php$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ non-existent

Примечание. Убедитесь, что файл non-existentне существует.

Другие вопросы по тегам