Пользовательское сообщение 404 при использовании PHP-FPM с Apache
У меня Apache (2.2.22 на Debian), настроенный для обработки файлов PHP через FastCGI:
Приложение SetHandler / x-httpd-php
FilesMatch>
Приложение 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
..
Directory>
На запросы о несуществующих файлах, отличных от 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
не существует.