59 votes

Nginx - Personnalisation de la page 404

Nginx+PHP (sur fastCGI) fonctionne très bien pour moi. Lorsque j'entre le chemin d'un fichier PHP qui n'existe pas, au lieu d'obtenir la page d'erreur 404 par défaut (qui s'affiche pour tout fichier .html invalide), j'obtiens simplement le message "No input file specified".

Comment puis-je personnaliser cette page d'erreur 404 ?

122voto

Great Turtle Points 1774

Vous pouvez configurer une page d'erreur personnalisée pour chaque bloc d'emplacement dans votre nginx.conf, ou une page d'erreur globale pour l'ensemble du site.

Pour rediriger vers une simple page 404 not found pour un emplacement spécifique :

location /my_blog {
    error_page    404 /blog_article_not_found.html;
}

Une page 404 pour l'ensemble du site :

server {
    listen 80;
    error_page  404  /website_page_not_found.html;
    ...

Vous pouvez regrouper les codes d'erreur standard afin de disposer d'une page unique pour plusieurs types d'erreurs :

location /my_blog {
    error_page 500 502 503 504 /server_error.html
}

Pour rediriger vers un serveur totalement différent, en supposant que vous aviez un serveur en amont nommé server2 défini dans votre section http :

upstream server2 {
    server 10.0.0.1:80;
}
server {
    location /my_blog {
        error_page    404 @try_server2;
    }
    location @try_server2 {
        proxy_pass http://server2;
    }

El manuel peut vous donner plus de détails, ou vous pouvez chercher sur google les termes nginx.conf et error_page pour des exemples concrets sur le web.

2 votes

Savez-vous s'il est possible d'utiliser un caractère générique d'erreur ? Quelque chose comme error_page 50* = /error_50x.html; ?

0 votes

Les caractères génériques ne sont pas autorisés - la page wiki pour cette commande serveur est ici wiki.nginx.org/NginxHttpCoreModule#error_page - Ils ne sont pas non plus nécessaires puisque les codes d'erreur sont définis par le protocole HTTP qui ne change pas très souvent. Voir w3.org/Protocoles/rfc2616/rfc2616-sec10.html o fr.wikipedia.org/wiki/List_of_HTTP_status_codes pour la liste complète et je suppose que vous pouvez ajouter les chiffres que vous voulez si vous pensez que de futurs codes seront nécessaires.

1 votes

Merci. Actuellement, j'ai 3 règles : /403.html , /404.html y /5xx.html ils partagent tous la même root mais d'une manière ou d'une autre, si je spécifie l'emplacement ~ /(?:40[34]|5xx)[.]html$ il rendra les pages d'erreur par défaut de nginx, cependant, si j'utilise un emplacement non-regex il fonctionne. Avez-vous une idée de la raison pour laquelle cela se produit ?

49voto

WizKid Points 2332

Vous utilisez la propriété error_page dans le fichier nginx config .

Par exemple, si vous avez l'intention de définir la page d'erreur 404 à /404.html utiliser

error_page 404 /404.html;

Configurer la page d'erreur 500 pour /500.html est aussi simple que :

error_page 500 /500.html;

4 votes

Bien que le lien soit correct et que la réponse fonctionne de façon minimale sans le lien, elle pourrait bénéficier d'une élaboration supplémentaire.

1 votes

@Paul Je suis 100% d'accord avec vous sur ce point, c'est pourquoi j'ai ajouté quelques exemples de code à cette réponse ;-)

39voto

dhr_p Points 159

Attention à la syntaxe ! La Grande Tortue les a utilisés de manière interchangeable, mais :

error_page 404 = /404.html;

Renverra la page 404.html avec un code d'état de 200 (parce que = a relayé cela à cette page).

error_page 404 /404.html;

Renvoie la page 404.html avec un code d'erreur 404 (l'original).

https://serverfault.com/questions/295789/nginx-return-correct-headers-with-custom-error-documents

1 votes

C'est un détail important !

2 votes

Et 2 ans plus tard, j'ai corrigé mon code. Merci dhr_p. :)

29voto

Grigori Kochanov Points 281

Le paramètre "error_page" effectue une redirection, en convertissant la méthode de requête en "GET", ce n'est pas une page de réponse personnalisée.

La solution la plus simple est

     server{
         root /var/www/html;
         location ~ \.php {
            if (!-f $document_root/$fastcgi_script_name){
                return 404;
            }
            fastcgi_pass   127.0.0.1:9000;
            include fastcgi_params.default;
            fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
        }

Au fait, si vous voulez que Nginx traite les statuts 404 retournés par les scripts PHP, vous devez ajouter

[fastcgi_intercept_errors][1] on;

Par exemple

     location ~ \.php {
            #...
            error_page  404   404.html;
            fastcgi_intercept_errors on;
         }

0 votes

Merci beaucoup d'avoir posté ce message @Grigori, j'ai utilisé votre code ci-dessus pour résoudre mon problème nginx également.

1 votes

Parfait, fastcgi_intercept_errors on est exactement ce que je recherchais.

0 votes

@TheBlackBenzKid parce que c'est une redirection avec "request method changed to "GET"", pas une réponse personnalisée, et le corps de la requête est perdu.

17voto

Isius Points 929

Ces réponses ne sont plus recommandées depuis try_files fonctionne plus rapidement que if dans ce contexte. Il suffit d'ajouter try_files dans votre bloc d'emplacement php pour tester si le fichier existe, sinon il renvoie un 404.

location ~ \.php {
    try_files $uri =404;
    ...
}

1 votes

Cela m'a beaucoup aidé. Je n'ai trouvé aucune suggestion d'utilisation sur Internet. Je ne savais pas que l'on pouvait utiliser des conditionnels dans les fichiers try_files.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X