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.
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_found
benannte 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.
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.
Die Verwendung if
innerhalb eines location
Blocks ist intuitiv, wie dieses Dokument veranschaulicht. Bei Verwendung error_page
eines 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 server
Blocks 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; }