¿Por qué una declaración de devolución en nginx.conf podría devolver una ubicación de archivo de texto sin formato al navegador en lugar del archivo real que se va a representar?

¿Por qué una declaración de devolución en nginx.conf podría devolver una ubicación de archivo de texto sin formato al navegador en lugar del archivo real que se va a representar?

Ambiente:Nginx, Nodo.js

Estoy experimentando con el manejo de errores en Nginx y no tengo suerte al devolver archivos.

En el ngxinx.confsiguiente ejemplo simplificado, si http request_methodno es GET, HEADo POSTme gustaría que el servidor devuelva la página de error 405.html.

Salida esperada:405.html se envía al navegador.

Salida real:este texto sin formato se envía al navegador. http://www.example.com/html/405.html

Nota: Estoy probando esto en Postman para no tener que instalar una extensión adicional en Chrome que permita enviar varios métodos HTTP al servidor.

Porciones relevantes de mi configuración:

server {

    include conf.d/listen-80;

    server_name example.com www.example.com;

    if ($request_method !~ ^(GET|HEAD|POST)$) {
        return 405 $scheme://www.example.com/html/405.html;
    }

    return 301 https://www.example.com$request_uri;

}

server {

    include conf.d/listen-443;

    server_name example.com;

    include conf.d/letsencrypt;

    if ($request_method !~ ^(GET|HEAD|POST)$) {
        return 405 $scheme://www.example.com/html/405.html;
    }

    return 301 https://www.example.com$request_uri;

}

server {

    include conf.d/listen-443;

    server_name www.example.com;

    include conf.d/letsencrypt;

    if ($request_method !~ ^(GET|HEAD|POST)$) {
        return 405 $scheme://www.example.com/html/405.html;
    }

    root /srv/example/views/public;

    location ~* \.(htm|html)$ {
        include conf.d/content-security-policy-html-rendered;
        include conf.d/cache-control-30-days;
        include conf.d/security-headers-html-rendered;
    }
}

Respuesta1

La URL posterior return nnnse trata únicamente como una URL de destino para el código de redireccionamiento (códigos de estado 301, 302, 303, 307 y 308). La documentación no dice claramente qué hace cuando el código es otra cosa.

Para obtener una página de error en su caso, utilice lo siguiente:

if ($request_method !~ ^(GET|HEAD|POST)$) {
    return 405;
}

error_page 405 /html/405.html;

Esto le indicará a nginx que envíe /html/405.htmlcuando se devuelva el código de estado 405.

información relacionada