Служите пользовательским 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 правильно устанавливает a 404 код ответа, затем Nginx попытается обработать ошибку снова! (который, очевидно, заканчивается в цикле),

Существует ли решение этого?

5
задан 16 September 2014 в 12:31
2 ответа

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

    fastcgi_intercept_errors on;

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

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

5
ответ дан 3 December 2019 в 01:38

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

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

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

0
ответ дан 3 December 2019 в 01:38

Теги

Похожие вопросы