¿La mejor manera de evitar el servidor predeterminado?

26

Tengo varios vhosts, y me gustaría "desactivar" el vhost predeterminado, ya sea por página en blanco, página de error o, en general, lo que sea el uso más eficiente de los recursos de Nginx, a la vez que solo permitir el acceso a otros vhosts a través de dominios predefinidos

DanH
fuente

Respuestas:

42

Defina un servidor predeterminado que devuelva un código HTTP 444 :

server {
    listen      80 default_server;
    server_name _;
    return      444;
}

(Devolver un código de error 4xx significa que las solicitudes pueden ser interpretadas por un cliente como una solicitud fallida, en lugar de una página en blanco HTTP 200, pero totalmente trabajado Confía en mí ).

Rob Howard
fuente
2
444 es un código específico de nginx no estándar : "se devuelve un
bzeaman
2
Esto no funciona para https. Una simple escucha 443 default_server tampoco funcionará, ya que el protocolo de enlace SSL ocurre antes que nada y nginx producirá un error antes de devolver 444. Una solución que todavía tengo que intentar pero debería funcionar es crear un certificado autofirmado para el servidor https predeterminado y, opcionalmente redirigir a http para evitar cualquier error del navegador.
Simon Bengtsson
El ticket nginx para proporcionar una buena manera de rechazar las conexiones SSL está aquí . También proporcionan una solución alternativa , configuración ssl_ciphers aNULL;.
nh2
Tenga en cuenta la solución que he mencionado se romperá clientes HTTPS no SNI-(como capaces de nginx propia proxy_pass, a menos que establezca proxy_ssl_server_name on;) lleguen a cualquier otro server_names(lo que en esencia romper los legítimos server_names para el puerto 443 que no quiere dejar pasar). Vea trac.nginx.org/nginx/ticket/195#comment:11 para más detalles.
nh2
4

Simplemente defina el vhost predeterminado que apuntará al directorio con el archivo index.html en blanco.

server {
    listen       80 default_server;
    server_name  _ ;
    root /var/www/placeholder ; 
    index index.html;
}

y coloque el índice en blanco en / var / www / placeholder

wojciechz
fuente
detectará cada solicitud que no llegue a ninguno de sus nombres de dominio y la respuesta con una página en blanco.
wojciechz
¿No puedes simplemente en return '';lugar de root...index?
oriadam
0

¿Por qué no simplemente negar todo

server {
    listen       80 default_server;
    server_name  _;

    location / {
        deny    all;
    }
}
Joel Ma
fuente