Вывести собственную 404-страницу на NGINX+PHP+FPM

Рейтинг: 0Ответов: 1Опубликовано: 05.11.2014

Уважаемые разработчики, помогите, пожалуйста, не понимаю я до конца принципов работы связки NGINX+PHP+FPM.

ЗАДАЧА: показать клиенту мою собственную 404 страницу, сгенерированную динамически в PHP, если от того же PHP получаем ответ, что такой страницы не существует.

В данный момент у меня, если PHP дает ответ, что страницы не существует, и написать header("HTTP/1.0 404 Not Found");, то переход на мою страницу происходит, но при этом:

HTTP/1.1 302 Moved Temporarily
Server: nginx
Date: Wed, 05 Nov 2014 11:02:06 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=15
Location: /404/

А если в PHP написать header("Status: 404 Not Found");, то перехода на мою страницу не происходит, nginx показывает свою 404, и, конечно, ответ сервера уже правильный:

HTTP/1.1 404 Not Found
Server: nginx

Мои эксперименты с:
fastcgi_intercept_errors on; - и выключал, и включал, результата не дало.
location /404/ { } - пробовал всевозможные варианты, но успеха не добился.
Естественно, что после каждого изменения перезагружаю nginx.

NGINX.conf (в сокращенном виде):

http {
    error_page 403 404 /404/;
    error_page 500 502 504 /504/;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-for $remote_addr;
    proxy_ignore_client_abort on;
    proxy_intercept_errors on;
    proxy_redirect off;
    proxy_store on;

    server {
        server_name namesite.ru;

        location / {
            rewrite ^/([^/]+).html$ /index.php?page=$1& last;
            rewrite ^/([^/]+)/?(.*)$ /index.php?page=$1$2& last;
            break;
            root /accounts/namesite/www;
            index index.php;
        }
        location ~ .php$ {
                fastcgi_split_path_info ^(.+\.php)(.*)$;
                fastcgi_pass backend;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME /accounts/namesite/www$fastcgi_script_name;
                include fastcgi_params;
                fastcgi_param QUERY_STRING $query_string;
                fastcgi_param REQUEST_METHOD $request_method;
                fastcgi_param CONTENT_TYPE $content_type;
                fastcgi_param CONTENT_LENGTH $content_length;
                fastcgi_intercept_errors on;
                fastcgi_ignore_client_abort off;
                fastcgi_connect_timeout 60;
                fastcgi_send_timeout 180;
                fastcgi_read_timeout 180;
                fastcgi_buffer_size 128k;
                fastcgi_buffers 4 256k;
                fastcgi_busy_buffers_size 256k;
                fastcgi_temp_file_write_size 256k;
        }

        #location /404/ {
        #}

    }

    upstream backend {
        server;
    }
}

Ответы

▲ 1

Дык у вас все запросы направляются на index.php, стало быть и 404 должна идти через index.php Попробуйте добавить в свой конфиг в server после server_name:

error_page 404 = /index.php;