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'.
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/;
}
}
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;
}
}
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;
}
}
}
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;
...
}
É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
)