Wie verwende ich die lokale Fehlerseite, wenn die Remote-Fehlerseite nicht gefunden wird?

Wie verwende ich die lokale Fehlerseite, wenn die Remote-Fehlerseite nicht gefunden wird?

Ich versuche, einen Fallback für meine Fehlerseite zu erstellen. Im Grunde sollte die Logik etwa wie folgt aussehen:

  1. foobar.html laden
  2. existiert nicht auf dem Remote-Server -> lade 404.html vom Remote-Server, um die 404-Seite anzuzeigen
  3. existiert nicht auf dem Remote-Server -> 404.html im lokalen Dateisystem laden

Das Laden beider localhost/404.htmlfunktioniert localhost/global404.html, aber wenn ich es abbreche localhost/404.html(indem ich die Datei vom HTTP-Server entferne), wird die global404.htmlSeite nicht wie erwartet angezeigt.

server {
    listen 80;
    server_name example.com www.example.com;
    proxy_intercept_errors on;

    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        error_page 404 /404.html;
    }

    location /404.html {
        proxy_pass http://localhost:3000/404.html;
        error_page 404 /global404.html;
    }

    location /global404.html {
        root /usr/share/nginx/html;
    }
}

Das oben genannte funktioniert einwandfrei, wenn ich darauf klicke http://localhost/404.html(wenn sich die Datei 404.html auf dem Remote-Server befindet, wird dies angezeigt; wenn ich die Datei lösche, wird die Datei global404.html geladen).

Wenn ich jedoch eine nicht vorhandene Seite eingebe, erhalte ich nur die Standard-404-Seite von Nginx.

Antwort1

Dank der Formulierung eines Kommentars zu der Frage konnte ich die recursive_error_pagesOption finden, die Kaskadierung/Rekursion ermöglicht error_pages. Ich fühle mich dumm, weil ich sie in der Dokumentation übersehen habe.

Aber einfach tun

server {
    listen      80;
    server_name example.com www.example.com;
    proxy_intercept_errors on;
    recursive_error_pages on;

    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        error_page 404 /404.html;
    }

    location /404.html {
        proxy_pass http://localhost:3000/404.html;
        error_page 404 /global404.html;
    }

    location /global404.html {
        root /usr/share/nginx/html;
    }
}

hat wunderbar geklappt. Ich liebe Nginx.

verwandte Informationen