Eu tenho dois hosts virtuais no meu servidor nginx com seus respectivos nomes de domínio. Um é http apenas porque é um site estático (siteA), o outro é apenas https (siteB). Para o siteB tenho um redirecionamento permanente do acesso http para o acesso https.
A configuração para siteA
é
server {
listen 80;
listen [::]:80;
server_name siteA.example.com;
...
location / {
...
}
}
A configuração para siteB
é
server {
listen 80;
listen [::]:80;
server_name siteB.example.com;
location / {
return 301 https://$server_name$request_uri;
}
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name siteB.example.com;
...
location / {
...
}
}
O problema é que quando eu acesso https://siteA.example.com
eu volto https://siteB.example.com
. Como posso evitar isso?
Eu tenho que usar listen siteB.example.com:443 ssl;
em vez de simplesmente listen 443 ssl;
?
Eu esperava que server_name
especificasse o nome do servidor para corresponder ao valor HOST na solicitação HTTP.
Seu caso é aquele em que um
Host
cabeçalho é enviado, que não corresponde a nenhuma dasserver_name
diretivas na configuração.O Nginx (assim como o Apache) resolverá isso respondendo à solicitação no contexto do
default_server
item que, se não for fornecido, será escolhido na primeira leitura do host virtual.Se você tiver endereços IP diferentes para os hosts, poderá optar por filtrar a
listen
diretiva, mas se compartilhar IPs, a maneira canônica é criar umdefault_server
item dedicado com uma regra de reescrita que sempre retornará uma página "Host não encontrado" e uma Erro HTTP, geralmente 404.