web-dev-qa-db-fra.com

Comment obtenir que nginx renvoie toujours un 404 personnalisé pour l'hôte par défaut

J'ai nginx 0.8.53 configuré avec certains hôtes virtuels qui fonctionnent comme je le veux. Cependant, en raison de la "meilleure correspondance" de nginx sur les hôtes virtuels, je dois ajouter un hôte par défaut pour intercepter toutes les demandes qui ne concernent pas un hôte virtuel spécifique. J'aimerais que l'hôte par défaut renvoie une page 404 qui ne précise pas que j'exécute nginx 0.8.53.

J'ai supposé que cela devrait être quelque chose comme:

# The default server.
#
server {
    listen       80 default_server;
    server_name  everythingelse;

    # Everything is a 404
    location / {
        return 404;
    }
    error_page 404 /opt/local/html/404.html;
}

Mais cela retourne toujours la page par défaut nginx 404 qui porte le numéro de version. Il semble que le 'retour 404' ignore la configuration 'error_page'.

15
Tim P

Voici ce que j'ai dans ma conf pour le faire fonctionner:

# The default server.
server {
  listen       80 default_server;
  server_name  everythingelse;

  error_page 404 /404.html;

  # Everything is a 404
  location / {
    return 404; #return the code 404
  }

  # link the code to the file
  location = /404.html {
    #EDIT this line to make it match the folder where there is your errors page
    #Dont forget to create 404.html in this folder
    root  /var/www/nginx/errors/;
  }
}
28
0x1gene

Très peu de directives dans nginx prennent un chemin de système de fichiers. Vous voulez quelque chose comme:

# The default server.
server {
  listen       80 default_server;
  server_name  everythingelse;

  root /opt/local/html;

  error_page 404 /404.html;

  # Everything is a 404
  location / {
    return 404;
  }

  # EDIT: You may need this to prevent return 404; recursion
  location = /404.html {
    internal;
  }
}
3
kolbyjack

Déplacez la directive error_page vers le haut de la conf avant d'appeler le retour 404.

Cela devrait fonctionner:

# The default server.
#
server {
    listen       80 default_server;
    server_name  everythingelse;
    error_page 404 /error_docs/404.html;

    # Everything is a 404
    location / {
        return 404;
    }

    # Custom Error Page
    location /error_docs {
        alias /opt/local/html/;
        log_not_found  off;
        access_log off;
    }
}

Cela utilisera le même personnalisé pour tous les sites (serveurs). Vous devez ajouter l'emplacement de la documentation d'erreur.

http {
error_page 404 /error_docs/404.html;

...

    # The default server.
    #
    server {
        listen       80 default_server;
        server_name  everythingelse;

        # Everything is a 404
        location / {
            return 404;
        }

        # Custom Error Page
        location /error_docs {
            alias /opt/local/html/;
            log_not_found  off;
            access_log off;
        }
    }
}
2
Dayo

Avant le bloc Server, vous utilisez probablement l'instruction include: 

include /etc/nginx/conf.d/*.conf;
server {
    listen 80;
    ...
}

J'ai eu le même problème, que j'ai commenté cette ligne et cela a fonctionné pour moi 

#include /etc/nginx/conf.d/*.conf;
server {
    listen 80;
    ...
}
0
CatSpy

Étant donné que root et error_page sont des directives valides au niveau du bloc http, il est possible de tirer parti du comportement d'héritage de la configuration de nginx. 

Pour partager des pages d'erreur personnalisées entre tous mes hôtes virtuels (afin que les requêtes sur des hôtes virtuels inconnus ou des ressources inexistantes dans des hôtes virtuels connus obtiennent mes pages d'erreur personnalisées en réponse à la définition de error_page), j'utilise la recette suivante.

1/ Ajoutez ces trois lignes à /etc/nginx/nginx.conf

# …
root /var/www/whatever # Used by undefined hosts
error_page 403 404 =404 /404.html
error_page 502 503 504 =500 /500.html
# …

2/ Créez /etc/nginx/sites-available/catchall avec l'extrait suivant en tant que serveur virtuel «attraper tout».

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    # SSL rules here if required
    server_name _;
}

3/ Créez des fichiers 404.html et 500.html dans chaque racine de document lorsqu'une erreur personnalisée doit être utilisée (ou liez celles de/var/www/what), sinon, les valeurs par défaut seront utilisées. 

Cela dit, toutes les directives ne peuvent pas hériter d'un champ d'application de niveau supérieur et, pire encore, certaines héritages ne se comportent pas comme on pouvait s'y attendre à première vue.
- Compréhension de la structure du fichier de configuration NGINX et du contexte de configuration
- Sujet SO intéressant: Nid d’emplacement

(Utilisation de Debian9 et nginx/1.10.3)

0
Stphane