Por que a diretiva proxy_intercept_errors do Nginx requer uma reescrita para funcionar corretamente?

6

A seguir, uma configuração do servidor Nginx de amostra. Sem o bloco de localização "talismã mágico", o conteúdo do erro com proxy resulta em uma página Nginx 404, em vez da página de erro personalizada ser exibida.

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

As páginas de erro não deflagradas 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;
    }
}
    
por Aubrey Falconer 28.05.2013 / 20:56

1 resposta

2

Eu sinto muito que esta resposta comece tarde, bu a partir de agora, com a versão estável v1.8.1 atual, a configuração que você forneceu deve funcionar sem qualquer talismã .

Se você forneceu a versão que estava experimentando, seria uma boa ideia ver se um bug foi corrigido ou se a configuração foi falha.

Eu sugiro que você verifique sua configuração, já que você definitivamente não precisa deste /admin/ location nem da sua diretiva rewrite contida. Tome um cuidado muito especial em 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, testar com êxito, o snippet de configuração e integrar lentamente as alterações e ver em que ponto 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;
    }
}
    
por 04.04.2016 / 23:03