
Eu tenho um servidor Nginx que hospeda o domínio principal foo.com
e um subdomínio bar.foo.com
de um site. Eu só tenho um certificado para meu domínio principal, então só quero solicitações HTTP para o subdomínio. Configurei os dois blocos de servidor e todas as solicitações funcionam bem: http://foo.com
serão redirecionadas para https://foo.com
e http://bar.foo.com
permanecerão apenas em HTTP.
No entanto, surgiu um problema quando tentei me conectar https://bar.foo.com
, embora eu não tenha configurado o bloco do servidor de subdomínio para escutar solicitações 443 ou SSL, a solicitação ainda é tratada e após receber um aviso do navegador de que o certificado tem um nome de host diferente diferente daquela que estou solicitando, a página que recebo é do domínio principal foo.com
.
Então, aparentemente, o server
bloco que deveria ouvir apenas as solicitações HTTPS do meu domínio principal, de alguma forma também está ouvindo as solicitações HTTPS do subdomínio, não quero que isso aconteça.
Aqui está minha configuração para o domínio principal:
server {
listen 80;
server_name foo.com www.foo.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name foo.com www.foo.com;
ssl on;
ssl_certificate /etc/nginx/cert/foo.com.pem;
ssl_certificate_key /etc/nginx/cert/foo.com.key;
...
location / {
root /var/www/foo.com/public_html;
index index.html index.htm;
}
}
Aqui está minha configuração para o subdomínio:
server {
listen 80;
server_name bar.foo.com www.bar.foo.com;
location / {
root /var/www/bar.foo.com/public_html;
index index.html index.htm;
}
}
E aqui está um trecho do arquivo de configuração do Nginx:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
location / {
}
Tentei excluir foo.com
o listen
bloco de servidores 443 do meu domínio principal, mas não ajudou.
Gostaria que o Nginx não ouvisse solicitações como https://bar.foo.com
ou simplesmente retornasse 404 ou 444.
Responder1
Como você tem apenas um server
bloco configurado para a porta 443, ele é o servidor virtual padrão usado pelo nginx para atender todas as solicitações à porta 443.
Para adicionar um servidor padrão para a porta 443 (TLS), você pode adicionar o seguinte host virtual:
server {
listen 443 default_server;
server_name _;
return 444;
}
Responder2
Eu descobri a solução. Assim como @Tero e @Cosmic apontaram corretamente, meu único server
bloco 443 para o domínio principal está sendo definido como o server
bloco padrão para todas as 443 solicitações.
Comentei o server
bloco no arquivo de configuração do Nginx /etc/nginx/nginx.conf
e adicionei os dois server
blocos a seguir:
server {
listen 80 default_server;
server_name _;
return 444;
}
server {
listen 443 ssl default_server;
server_name _;
ssl_certificate /etc/nginx/cert/foo.bar.pem;
ssl_certificate_key /etc/nginx/cert/foo.bar.key;
return 444;
}
O primeiro será definido como o server
bloco padrão para quaisquer solicitações HTTP, eliminando quaisquer solicitações sem correspondência, e da mesma forma, o segundo descartará quaisquer solicitações 443 ou HTTPS sem correspondência.
A solução fornecida pelo @Tero não funcionará, porque o Nginx espera um certificado para qualquer server
bloco SSL, portanto, você precisará fornecer um certificado.