Nginx - Passer toutes les erreurs 404 à PHP-FPM pour une page d'erreur personnalisée de traitement

Je sais que cela a été demandé un millier de fois, mais toutes les réponses je me suis trouvé tout simplement ne fonctionne pas (pour moi, ou le plus souvent à l'origine de l'OP de ces questions)... Donc, je vais essayer d'expliquer le problème du mieux que je peux et j'espère que nous pourrons le faire fonctionner pour moi et pour les autres qui ont demandé avant.

Ma config Nginx (avec beaucoup d'autres chose sans pertinence supprimée) est comme suit:

http {
    # Config from here removed

    server {
            listen 80;
            listen 443 ssl;
            server_name mydomain.co.uk;

            ssl_certificate /xxxxxxx.crt;
            ssl_certificate_key /xxxxxxx.key;

            # Custom error pages
            root /var/www/viovet_frontend;
            error_page 404 = /error404.php;

            # Any simple .php page
            location ~ \.php$ {
                    root /var/www/xxxxxx;
                    #index index.php index.html;

                    include /etc/nginx/fastcgi.conf;
                    fastcgi_pass phpfastcgiservers;
                    include fastcgi_params;

                    fastcgi_intercept_errors on;
            }

            # Lots more config and re-write rules here removed
    }

    upstream phpfastcgiservers {
            server xxxxx1:9001;
            server xxxxx2:9001;
            server xxxxx3:9001;
            fair;
    }
}

Tout ce que je suis en train de faire est d'obtenir Nginx pour attraper tous les 404s et de les envoyer à PHP-FPM via location ~ \.php$ d'avoir une page d'erreur personnalisée indiqués à l'utilisateur, mais je reçois toujours le standard de Nginx page d'erreur.

Les urls suivantes devraient tout de montrer la sortie de mydomain.co.uk/error404.php:

  • mydomain.co.royaume-uni/someNonExistantFile (n'a pas à correspondre à n'importe quel emplacement des blocs)
  • mydomain.co.uk/someMissingFile.php (adapté de l' .php emplacement du fichier, mais le fichier n'existe pas)

Mais en fait ils montrent la norme Nginx page 404. Si le location ~ \.php$ renvoie un autre code d'erreur 404 (e.g 5xx), alors nous ne voulons pas participer, il suffit de retourner le contenu et les en-têtes que FastCGI retournée dans la première place.

J'espère qu'un sens et que quelqu'un peut vous aider. Je vous remercie à l'avance.

EDIT: j'ai essayé d'ajouter recursive_error_pages on; à la ligne après # Custom error pages mais c'est en fait la cause de toute Nginx 404 Not Found erreurs pour devenir Nginx 500 Internal Server Error erreurs.

EDIT: Ajouter d'autres fichiers:
/etc/nginx/fastcgi.conf

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
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_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

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_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

Je suppose que je n'ai probablement pas besoin de ces deux de toute façon! 😉

Essayez de déplacer root /var/www/xxxx à l'extérieur de votre emplacement ~php.
PHP-FPM et Nginx sont sur des machines différentes. Faire ce (seul) l'habitude d'aider Nginx l'envoyer à PHP-FPM.

OriginalL'auteur Luke Cousins | 2014-04-16