Por que uma instrução de retorno em nginx.conf pode retornar um local de arquivo de texto simples para o navegador em vez do arquivo real a ser renderizado?

Por que uma instrução de retorno em nginx.conf pode retornar um local de arquivo de texto simples para o navegador em vez do arquivo real a ser renderizado?

Ambiente:Nginx, Node.js

Estou experimentando o tratamento de erros no Nginx e não estou tendo sorte ao retornar arquivos.

No simplificado ngxinx.confabaixo se o http request_methodnão for GET, HEADou POSTgostaria que o servidor retornasse a página de erro 405.html.

Esperava saída:405.html é enviado ao navegador.

Saída real:este texto simples é enviado ao navegador. http://www.example.com/html/405.html

Nota: estou testando isso no Postman para não precisar instalar uma extensão adicional no Chrome que permite enviar vários métodos HTTP para o servidor.

Partes relevantes da minha configuração:

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

Responder1

A URL seguinte return nnné tratada apenas como URL de destino para código de redirecionamento (códigos de status 301, 302, 303, 307 e 308). A documentação não diz claramente o que faz quando o código é outra coisa.

Para obter uma página de erro no seu caso, use o seguinte:

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

error_page 405 /html/405.html;

Isso dirá ao nginx para enviar /html/405.htmlquando o código de status 405 for retornado.

informação relacionada