Fallback für 404-Seiten in Nginx

475
Riccardo Bestetti

Ich erstelle eine "userdir" -Konfiguration, bei der der Webserver Dateien im Verzeichnis ~ / www jedes Benutzers bereitstellt.

Ich habe den folgenden Konfigurationsausschnitt:

server { listen 443; listen [::]:433;  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;  server_name ~^(?<user>\w+)\.example\.com$;  root /var/www/userdir; index index.html; error_page 404 = @not_found; add_header X-User $user;  location / { root /home/$user/www; try_files $uri $uri/ =404; }  location @not_found { if (-f /home/$user/www/404.html) { root /home/$user/www; }  try_files /404.html =500; } } 

Wenn eine nicht vorhandene Datei angefordert wird, wird der @not_foundbenannte Ort eingegeben. Zunächst wird geprüft, ob der Benutzer über eine benutzerdefinierte 404-Seite verfügt. Wenn dies der Fall ist, wird der Stammordner des Dokuments auf das Verzeichnis des Benutzers gesetzt, bevor 404.html ausgeliefert wird.

Das Ergebnis des Konfigurationsblocks ist jedoch, dass, wenn 404.html im Benutzerverzeichnis vorhanden ist, die generische Nginx 404-Seite zurückgegeben wird. Andernfalls wird /var/www/userdir/404.html zurückgegeben.

1

2 Antworten auf die Frage

1
Gerard H. Pille

Dies scheint den Trick zu tun:

location / { root /home/$user/www; try_files $uri $uri/ =404; error_page 404 /404.html; } 

Möglicherweise müssen Sie "error_page 404 = @not_found;" entfernen.

1
Richard Smith

Die Verwendung ifinnerhalb eines locationBlocks ist intuitiv, wie dieses Dokument veranschaulicht. Bei Verwendung error_pageeines benannten Ortes ändert sich auch der Antwortcode von 404 in 200, was möglicherweise nicht wünschenswert ist.

Sie können Ihren Test verwenden, um eine Variable am oberen Rand des serverBlocks festzulegen, die dann zum Festlegen der Position der Fehlerseitendatei verwendet werden kann.

Zum Beispiel:

set $ERROR_ROOT "/var/www/userdir"; if (-f /home/$user/www/404.html) { set $ERROR_ROOT "/home/$user/www"; }  error_page 404 /404.html;  location / { root /home/$user/www; try_files $uri $uri/ =404; }  location = /404.html { root $ERROR_ROOT; } 
Ich bin mir nicht sicher, ob ich voll und ganz verstehe, warum meine Lösung nicht funktioniert, auch nachdem ich den Artikel gelesen und weitergeleitet habe. Vielen Dank für die Bereitstellung einer funktionierenden Lösung. Riccardo Bestetti vor 5 Jahren 0