Warum erfordert die Anweisung proxy_intercept_errors von Nginx ein Umschreiben, um ordnungsgemäß zu funktionieren?

8

Im Folgenden finden Sie ein Beispiel für eine Nginx-Serverkonfiguration. Ohne den Positionsblock "magischer Talisman" führt der Proxy-Fehlerinhalt dazu, dass eine Nginx 404-Seite und nicht die angepasste Fehlerseite bereitgestellt wird.

Durch Entfernen der Anweisung proxy_intercept_errors wird eine ordnungsgemäße Proxy-Fehlerseite mit den richtigen http-Fehlercode-Headern bereitgestellt.

Nicht-fehlerhafte Fehlerseiten werden unabhängig von der Anwesenheit des magischen Talismans ordnungsgemäß gerendert.

Irgendwelche Ideen, was genau los ist?

server {
    server_name     mydomain.com "";
    listen          80;
    root            /var/www;
    error_page      400 401 402 403 404 500 501 502 503 504 /admin/error_page.htm;
    proxy_intercept_errors on;

    location /proxy/ {
        proxy_read_timeout  60s;
        proxy_set_header    Host $host;
        proxy_pass          http://myservers;
    }

    location /test404/ {
        return 404;
    }

    location /admin/ {    # this line constitute a magical talisman that fixes proxied error interception(???)(!)
        rewrite ^(/admin)(.*)$ /admin$2 break;
    }
}
Aubrey Falconer
quelle

Antworten:

4

Es tut mir leid, dass diese Antwort zu spät kommt. Ab sofort sollte die von Ihnen bereitgestellte Konfiguration mit der aktuellen stabilen Version 1.8.1 ohne Talisman funktionieren .

Wenn Sie die Version angegeben haben, mit der Sie experimentiert haben, ist es eine Idee zu prüfen, ob ein Fehler behoben wurde oder ob die Konfiguration fehlerhaft war.

Ich schlage vor, dass Sie Ihre Konfiguration überprüfen, da Sie diesen /admin/Speicherort und die darin enthaltene rewriteDirektive definitiv nicht benötigen . Gehen Sie besonders vorsichtig vor, wenn Sie alles entfernen, was nicht Teil dieses Tests ist (und was Sie nicht zeigen), da dies zu Störungen führen kann.

Als letzten Ausweg können Sie das folgende, erfolgreich getestete Konfigurations-Snippet ausprobieren und Änderungen langsam integrieren, um festzustellen, an welchem ​​Punkt die Ergebnisse von den Erwartungen abweichen:

server {
    listen      80;
    listen      [::]:80;
    server_name example.org;

    location /proxy {
        return 418 "Host: $host, Connection: $http_connection";
    }
}

server {
    listen      80;
    listen      [::]:80;
    server_name example.com;

    root /var/ious/files;

    error_page 418 = /error_page.html;
    proxy_intercept_errors on;

    location /proxy {
        proxy_pass http://example.org;
    }
}
Bernard Rosset
quelle
Danke, Bernard. Ich markiere Ihre Antwort als akzeptiert, da genug Zeit vergangen ist, dass ich mich nicht mehr daran erinnere, gegen welche Nginx-Version ich getestet habe, als die ursprüngliche Frage gestellt wurde.
Aubrey Falconer