Вот то, как моя конфигурация 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 правильно устанавливает a 404
код ответа, затем Nginx попытается обработать ошибку снова! (который, очевидно, заканчивается в цикле),
Существует ли решение этого?
nginx делает это, потому что вы ему сказали.
fastcgi_intercept_errors on;
Это означает, что nginx не будет обрабатывать сообщения об ошибках, сгенерированные PHP, , но вместо этого nginx будет обрабатывать их. Таким образом, вы попадаете в бесконечный цикл.
Чтобы решить проблему, удалите эту директиву (по умолчанию выключено
) или установите для нее явное значение выключено
.
Создайте сценарий, который генерирует страницу с ошибкой, чтобы возвращать HTTP 200 (т.е. правильную страницу), и он должен работать сразу.
nginx получит тело / 404 и обновит статус ответа - 404.
PS в качестве бонуса вы можете указать явное местоположение (например, location = / 404) и включить fastcgi_cache, чтобы ваш PHP-сервер не запрашивался каждый раз, когда вам нужно отображать страницу с ошибкой.