Fallback für 404-Seite in Nginx

1

Ich erstelle eine "userdir" -Konfiguration, in der der Webserver Dateien im ~ / www-Verzeichnis 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 die @not_found benannter Ort wird eingegeben. Zunächst wird geprüft, ob der Benutzer über eine benutzerdefinierte 404-Seite verfügt. Wenn dies der Fall ist, wird der Dokumentstamm auf das Benutzerverzeichnis festgelegt, bevor versucht wird, 404.html bereitzustellen.

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.

Riccardo Bestetti
quelle

Antworten:

1

Verwenden if innerhalb eines location Block ist kontraintuitiv, wie dieses Dokument illustriert. Auch mit error_page Ändert bei einem benannten Standort den Antwortcode von 404 auf 200, was möglicherweise nicht wünschenswert ist.

Sie können Ihren Test verwenden, um eine Variable am oberen Rand des Fensters festzulegen server Block, mit dem dann der Speicherort der Fehlerseitendatei festgelegt 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;
}
Richard Smith
quelle
Ich bin mir nicht sicher, warum meine Lösung nicht funktioniert, obwohl ich den Artikel gelesen habe, den Sie verlinkt haben. Vielen Dank für die Bereitstellung einer funktionierenden Lösung.
Riccardo Bestetti
1

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.

Gerard H. Pille
quelle