web-dev-qa-db-fra.com

Nginx - Personnalisation de la page 404

Nginx + PHP (sur fastCGI) fonctionne très bien pour moi. Lorsque j'entre un chemin vers un PHP qui n'existe pas, au lieu d'obtenir la page d'erreur 404 par défaut (qui vient pour tout fichier .html invalide), j'obtiens simplement un "Aucune entrée fichier spécifié. ".

Comment personnaliser cette page d'erreur 404?

50
thomas55

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

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

error_page 404 /404.html;

Définition de la page d'erreur 500 sur /500.html est aussi simple que:

error_page 500 /500.html;
38
WizKid

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 le site dans son ensemble.

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

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

Une page 404 à l'échelle du site:

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

Vous pouvez ajouter des codes d'erreur standard ensemble pour avoir une seule page 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 disposiez d'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;
    }

Le manuel peut vous donner plus de détails, ou vous pouvez rechercher sur Google les termes nginx.conf et error_page pour des exemples concrets sur le Web.

108
Great Turtle

Soyez prudent avec la syntaxe! Great Turtle les a utilisés de manière interchangeable, mais:

error_page 404 = /404.html;

Renvoie la page 404.html avec un code d'état de 200 (car = a relayé cela sur cette page)

error_page 404 /404.html;

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

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

31
dhr_p

Le paramètre "error_page" fait une redirection, convertissant la méthode de demande 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;
        }

Soit dit en passant, si vous souhaitez que Nginx traite l'état 404 renvoyé 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;
         }
28

Ces réponses ne sont plus recommandées car try_files fonctionne plus rapidement que if dans ce contexte. Ajoutez simplement try_files dans votre bloc d'emplacement php pour tester si le fichier existe, sinon retournez un 404.

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