Назад | Перейти на главную страницу

Обслуживать пользовательскую страницу 404, созданную PHP

Вот как выглядит моя конфигурация php-fpm:

location @site {
    fastcgi_pass   unix:/var/run/php5-fpm.sock;
    include fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME $document_root/index.php;

    fastcgi_intercept_errors on;
    error_page 404 /404;
}

Так как fastcgi_intercept_errors включен, когда мой маршрутизатор PHP возвращает 404, Nginx перенаправляет на /404. Хорошо.

Но с тех пор /404 генерируется моим приложением PHP, и мое приложение PHP правильно устанавливает 404 код ответа, тогда Nginx снова попытается обработать ошибку! (что, очевидно, заканчивается петлей)

Есть ли этому решение?

nginx делает это, потому что вы ему сказали.

    fastcgi_intercept_errors on;

Это означает, что nginx не будет обслуживать сообщения об ошибках, сгенерированные PHP, но вместо этого пусть nginx обрабатывает их. Таким образом, вы попадаете в бесконечный цикл.

Чтобы решить проблему, удалите эту директиву (по умолчанию off) или установите для него явное значение off.

Сделайте свой сценарий, который генерирует страницу ошибки, чтобы возвращать HTTP 200 (т.е. правильную страницу), и он должен работать сразу.

nginx получит тело / 404 и обновит статус ответа до 404.

P.S. в качестве бонуса вы можете указать явное местоположение (например, location = / 404) и включить fastcgi_cache, чтобы ваш PHP-сервер не запрашивался каждый раз, когда вам нужно отображать страницу с ошибкой.