Вот как выглядит моя конфигурация 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-сервер не запрашивался каждый раз, когда вам нужно отображать страницу с ошибкой.