Пользовательские страницы ошибок Nginx, PHP + FPM

Я пытаюсь создать несколько пользовательских страниц ошибок, но не могу заставить работать 500.

У меня есть следующая конфигурация:

server {
    listen 80;

    root /var/www/devsite;
    index index.php;
    server_name devsite;

    error_page 403 = /error.php?code=403;   
    error_page 404 = /error.php?code=404;
    error_page 500 = /error.php?code=500;

    location / {
        try_files $uri =404;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

}

Сначала я подумал, что это может быть из-за файла PHP, поэтому я изменил:

error_page 500 = /error.php?code=500;

На статическую страницу:

error_page 500 /500.html

Но он по-прежнему просто показывает пустую страницу с кодом ответа 500, когда я ломаю некоторый PHP-код, чтобы вызвать его.

Затем я попытался сделать это последним правилом внутри location ~ \.php$, но происходит то же самое. Любые идеи, почему пользовательская страница 500 не будет работать?

Я также заметил, что если вы попытаетесь получить доступ к файлу «отказано в доступе» с расширением .php, он не отобразит пользовательскую страницу 403, а вместо этого отобразит встроенную страницу. Есть ли способ сделать так, чтобы правило распространялось и на файлы .php?


person Ken    schedule 18.03.2014    source источник
comment
Какой у вас установлен уровень PHP error_reporting? Я только что вернулся к этому вопросу и понял, что мой ответ немного отличается от вашей проблемы.   -  person Stecman    schedule 08.04.2014


Ответы (1)


Часть, которую вам не хватает, — это директива fastcgi_intercept_errors. Без этой директивы Nginx не будет обрабатывать ответы от бэкендов CGI, пока они действительны:

Определяет, должны ли ответы сервера FastCGI с кодами больше или равными 300 передаваться клиенту или перенаправляться в nginx для обработки с помощью директивы error_page.

Вам нужно поместить следующее в место обработки PHP:

fastcgi_intercept_errors on;

Кроме того, вам может не понадобиться = в строках error_page (в зависимости от предполагаемого использования ). Этот синтаксис указывает Nginx использовать код ответа, возвращенный из скрипта PHP, на который вы указываете, вместо исходного кода ответа:

Если ответ об ошибке обрабатывается прокси-сервером или сервером FastCGI, и сервер может возвращать разные коды ответа (например, 200, 302, 401 или 404) ... ответьте кодом, который он возвращает.

person Stecman    schedule 20.03.2014
comment
Я добавил эту строку в location ~ \.php$, и теперь моя страница 404, сгенерированная PHP, не работает. Кажется, работают только статические страницы? Если я вместо этого попытаюсь использовать PHP-скрипт, он просто покажет общую ошибку Nginx. - person Ken; 21.03.2014