Por que a diretiva proxy_intercept_errors do Nginx exige que uma reescrita funcione corretamente?

8

A seguir, é apresentada uma amostra da configuração do servidor Nginx. Sem o bloco de localização "magic talisman", o conteúdo do erro por proxy resulta em uma página do Nginx 404 em vez da exibição da página de erro personalizada.

A remoção da diretiva proxy_intercept_errors serve uma página de erro com proxy adequada com cabeçalhos de código de erro http adequados.

As páginas de erro não-proxy são renderizadas corretamente, independentemente da presença do talismã mágico.

Alguma idéia do que exatamente está acontecendo?

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
fonte

Respostas:

4

Lamento que esta resposta comece tarde, mas a partir de agora, com a versão estável atual da v1.8.1, a configuração que você forneceu deve funcionar sem nenhum talismã .

Se você forneceu a versão em que estava testando, seria uma idéia verificar se um bug foi corrigido ou se a configuração foi falha.

Eu sugiro que você verifique sua configuração, pois você definitivamente não precisa deste /admin/local nem de sua rewritediretiva contida . Tome um cuidado muito especial ao remover tudo o que não faz parte deste teste (e que você não mostra), pois isso pode interferir.

Como último recurso, você pode tentar o seguinte, testado com sucesso, snippet de configuração e integrar lentamente alterações e ver em que momento os resultados divergem das expectativas:

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
fonte
Obrigado, Bernard. Estou marcando sua resposta como aceita, já que passou o tempo suficiente para não me lembrar mais da versão do Nginx em que estava testando quando a pergunta original foi feita.
Aubrey Falconer