
Tengo un servidor Nginx que aloja tanto el dominio principal foo.com
como un subdominio bar.foo.com
de un sitio web. Solo tengo un certificado para mi dominio principal, por lo que solo quiero solicitudes HTTP para el subdominio. He configurado ambos bloques de servidor y todas las solicitudes funcionan bien: http://foo.com
serán redirigidas a https://foo.com
y http://bar.foo.com
permanecen en HTTP.
Sin embargo, surge un problema cuando intenté conectarme https://bar.foo.com
, aunque no configuré el bloque del servidor del subdominio para escuchar solicitudes 443 o ssl, la solicitud aún se maneja y después de recibir una advertencia del navegador de que el certificado tiene un nombre de host diferente que la que estoy solicitando, la página que me sale es del dominio principal foo.com
.
Entonces, aparentemente, el server
bloque que se suponía que solo escucharía las solicitudes HTTPS de mi dominio principal, de alguna manera también está escuchando las solicitudes HTTPS del subdominio, no quiero que esto suceda.
Aquí está mi configuración para el dominio 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;
}
}
Aquí está mi configuración para el subdominio:
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;
}
}
Y aquí hay un fragmento del archivo de configuración de Nginx:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
location / {
}
Intenté eliminar foo.com
después listen
en el bloque del servidor 443 de mi dominio principal, pero no ayuda.
Me gustaría que Nginx no escuche solicitudes como https://bar.foo.com
o simplemente devuelva 404 o 444.
Respuesta1
Dado que solo tiene un server
bloque configurado para el puerto 443, es el servidor virtual predeterminado utilizado por nginx para atender todas las solicitudes al puerto 443.
Para agregar un servidor predeterminado para el puerto 443 (TLS), puede agregar el siguiente host virtual:
server {
listen 443 default_server;
server_name _;
return 444;
}
Respuesta2
He descubierto la solución. Tal como @Tero y @Cosmic señalaron correctamente, mi único server
bloque 443 para el dominio principal se establece en el server
bloque predeterminado para todas las solicitudes 443.
Comenté el server
bloque en el archivo de configuración de Nginx /etc/nginx/nginx.conf
y agregué los dos server
bloques siguientes:
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;
}
El primero se establecerá en el server
bloque predeterminado para cualquier solicitud HTTP, descartando cualquier solicitud no coincidente, y de manera similar, el segundo descartará cualquier solicitud 443 o HTTPS no coincidente.
La solución que proporcionó @Tero no funcionará porque Nginx espera un certificado para cualquier server
bloque SSL, por lo que deberá proporcionarle un certificado.