Je suis en train de configurer la gestion par nginx de certaines pages d'erreur et d'autres fichiers multimédias "par défaut" (tels que favicon.ico et robots.txt) en ce moment et j'ai rencontré un problème mineur pour que les choses fonctionnent comme je le souhaite pour certaines pages d'erreur .
Fondamentalement, ce que j'essaie de faire est de servir certains fichiers pour un serveur sous la racine de ce serveur, par exemple /var/www/someserver.com/robots.txt. Si ce fichier n'existe pas, je veux que nginx passe au "défaut", c'est-à-dire /var/www/default/robots.txt. C'est l'essentiel de la façon dont j'ai configuré (avec succès):
server {
...
root /var/www/someserver.com;
location ~* ^/(robots\.txt)$ {
error_page 404 = @default;
}
location @default {
root /var/www/default;
}
}
Cela fonctionne très bien.
J'essaie de faire la même chose pour les pages d'erreur, et je ne suis pas en mesure de le faire cependant:
server {
...
root /var/www/someserver.com;
error_page 404 /404.html;
location ~* ^/(404\.html)$ {
error_page 404 = @default;
}
location @default {
root /var/www/default;
}
}
Notez que cela "fonctionne" dans le sens où si vous visitez someserver.com/404.html, il essaiera d'abord de charger /var/www/someserver.com/404.html puis retombera dans / var / www / default /404.html si ce n'est pas trouvé. Cependant, si vous visitez someserver.com/blahblah, il n'affiche la page 404 que si elle est définie dans /var/www/someserver.com/. Il ne revient pas au répertoire par défaut si ce fichier n'existe pas.
Quoi qu'il en soit, vous pouvez probablement ce que j'essayais d'accomplir (c'est pourquoi j'ai inclus le premier exemple de travail).
Des idées?
Éditer:
Sur la base de la réponse de Martin F, voici ce que j'ai fini par rassembler:
# Doesn't work when error page is returned on a POST request
server {
...
root /var/www/someserver.com;
error_page 404 = @notfound;
error_page 500 502 504 = @server_error;
error_page 503 = @maintenance;
location @notfound {
try_files /404.html /../default/404.html =404;
}
location @server_error {
try_files /500.html /../default/500.html =500;
}
location @maintenance {
try_files /503.html /../default/503.html =503;
}
}
Cela fonctionne très bien. Le bloc réel de error_pages et d'emplacements ci-dessus se trouve dans un fichier server_defaults.conf qui est inclus avec chaque hôte virtuel, c'est pourquoi je n'ai pas codé en dur le chemin d'accès à chaque emplacement et utilisé un chemin d'accès relatif pour les valeurs par défaut.
Modifier 2:
Cette approche a un problème. Si vous POSTEZ sur une URL qui renvoie une erreur, la méthode de demande POST est envoyée avec les tentatives try_files. Cela (pour moi) entraîne une erreur 405 non autorisée, car nginx essaie essentiellement de POSTER par exemple /default/500.html au lieu d'obtenir simplement cette page.
Modifier 3:
J'ai posté une solution qui fonctionne beaucoup plus proche de mon idée d'origine.