Meu nginx.conf tem várias seções de "servidor" e uma seção de servidor pega-tudo. Aqui está um exemplo nginx.conf para dar uma ideia:
user www-data;
worker_processes auto;
worker_cpu_affinity auto;
pid /run/nginx.pid;
events {
worker_connections 4000;
use epoll;
accept_mutex off;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
error_log /var/log/nginx/error.log;
server {
listen 80;
server_name foo.com;
location / {
default_type text/plain;
return 200 "hello from foo.com";
}
error_page 500 502 503 504 /500.html;
}
server {
listen 80 default_server;
server_name _;
location / {
return 403 "sorry";
}
}
}
Estou esperando que o servidor retorne 403 se o cabeçalho "Host" for qualquer coisa menos "foo.com".
Aparentemente, alguém está executando o Burp Suite no meu servidor, e notei um comportamento interessante quando eles enviam um cabeçalho "Host: foo.com:more-stuff-here": NGINX roteia a solicitação para a primeira seção "servidor". Parece que ele ignora os dois pontos e tudo depois dele no valor do cabeçalho.
Eu posso reproduzi-lo localmente com o nginx.conf acima:
$ curl -H "Host: foo.com" http://127.0.0.1
hello from foo.com
$ curl -H "Host: foo.com:unexpected-content" http://127.0.0.1
hello from foo.com
$ curl -H "Host: bar.com" http://127.0.0.1
sorry
Por que o NGINX faz isso? Esse é um comportamento esperado? O que devo mudar no nginx.conf para garantir que as solicitações com o cabeçalho "Host: foo.com:more-stuff-here" vão para o bloco padrão?
Atualização: para quem está pesquisando o mesmo problema, também criei um ticket no rastreador de problemas NGINX .
A definição do cabeçalho do host no HTTP RFC indica que o cabeçalho do Host deve ter o formato
host:port
,:port
sendo opcional.O nginx vê tudo após os dois pontos como a porta para o host, mas é irrelevante no seu contexto, pois você não especificou um bloco de servidor dessa maneira. Portanto, ele usa a correspondência mais próxima possível, o host sem a "porta".
O seguinte pode funcionar para
default_server
:A parte importante é o til
~
, que indica uma correspondência de expressão regular.O único pensamento alternativo que eu poderia pensar seria codificar algo no nível do aplicativo do lado do servidor para verificar o valor do host e retornar a resposta 403 no código.
No entanto, essa não é realmente a maneira correta de fazer isso, porque o problema é um problema do cliente a ser corrigido e não do seu aplicativo.
por exemplo, tirando desta resposta SO , dado um aplicativo PHP, você pode facilmente alterar essa lógica para obter o efeito desejado, observe especificamente a verificação do SERVER_PORT conforme a resposta de Gerald