
Ambiente:Nginx, Node.js
Estou experimentando o tratamento de erros no Nginx e não estou tendo sorte ao retornar arquivos.
No simplificado ngxinx.conf
abaixo se o http request_method
não for GET
, HEAD
ou POST
gostaria 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.html
quando o código de status 405 for retornado.