Perché la direttiva proxy_intercept_errors di Nginx richiede una riscrittura per funzionare correttamente?


8

Di seguito è riportato un esempio di configurazione del server Nginx. Senza il blocco di posizione "talismano magico", il contenuto di errore in proxy comporta la visualizzazione di una pagina Nginx 404 anziché della pagina di errore personalizzata.

La rimozione della direttiva proxy_intercept_errors serve una pagina di errore proxy corretta con le intestazioni corrette del codice di errore http.

Le pagine di errore non proxy vengono visualizzate correttamente indipendentemente dalla presenza del talismano magico.

Qualche idea su cosa stia succedendo esattamente?

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;
    }
}

Risposte:


4

Mi dispiace che questa risposta entri in ritardo, ma per ora, con l'attuale versione stabile v1.8.1, la configurazione che hai fornito dovrebbe funzionare senza alcun talismano .

Se hai fornito la versione su cui stavi sperimentando, sarebbe un'idea vedere se un bug è stato corretto o se la configurazione era difettosa.

Ti suggerisco di ricontrollare la tua configurazione, dal momento che sicuramente non hai bisogno di questa /admin/posizione né della sua rewritedirettiva contenuta . Fai molta attenzione a rimuovere tutto ciò che non fa parte di questo test (e che non mostri) in quanto potrebbe interferire.

Come ultima risorsa, potresti provare questo, testato con successo, frammento di configurazione e integrare lentamente le modifiche e vedere a che punto i risultati divergono dalle aspettative:

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;
    }
}

Grazie Bernard. Sto contrassegnando la tua risposta come accettata da quando è trascorso abbastanza tempo che non ricordo più quale versione di Nginx stavo testando quando è stata posta la domanda originale.
Aubrey Falconer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.