¿Por qué la directiva proxy_intercept_errors de Nginx requiere una reescritura para funcionar correctamente?

8

A continuación se muestra una configuración de servidor Nginx de muestra. Sin el bloque de ubicación "talismán mágico", el contenido de error proxy genera una página Nginx 404 en lugar de la página de error personalizada que se sirve.

La eliminación de la directiva proxy_intercept_errors sirve una página de error proxy adecuada con encabezados de código de error http adecuados.

Las páginas de error no representadas se representan correctamente independientemente de la presencia del talismán mágico.

¿Alguna idea de lo que está pasando exactamente?

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;
    }
}
Halconero Aubrey
fuente

Respuestas:

4

Lamento que esta respuesta llegue tarde, pero a partir de ahora, con la versión estable actual v1.8.1, la configuración que proporcionó debería funcionar sin ningún talismán .

Si proporcionó la versión con la que estaba experimentando, sería una idea ver si se corrigió un error o si la configuración era defectuosa.

Le sugiero que verifique su configuración, ya que definitivamente no necesita esta /admin/ubicación ni su rewritedirectiva contenida . Tenga especial cuidado al eliminar todo lo que no sea parte de esta prueba (y que no se muestre) ya que podría interferir.

Como último recurso, puede probar este siguiente fragmento de configuración probado con éxito e integrar lentamente los cambios y ver en qué momento los resultados difieren de las 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
fuente
Gracias Bernard. Estoy marcando su respuesta como aceptada ya que ha pasado suficiente tiempo para que ya no recuerde con qué versión de Nginx estaba probando cuando se formuló la pregunta original.
Aubrey Falconer