Il modo migliore per prevenire il server predefinito?


26

Ho un numero di vhosts e vorrei "disattivare" il vhost predefinito, sia per pagina vuota, pagina di errore o in generale qualunque sia l'uso più efficiente delle risorse di Nginx, consentendo al contempo l'accesso ad altri vhosts solo tramite domini predefiniti.

Risposte:


42

Definire un default_server che restituisce un codice HTTP 444 :

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

(Restituire un codice di errore 4xx significa che le richieste possono essere interpretate da un client come una richiesta non riuscita, piuttosto una pagina vuota HTTP 200 ma totalmente fidata .)


2
444 è un codice specifico nginx non standard : "viene restituito un codice non standard 444 di un nginx speciale che chiude la connessione"
bzeaman,

2
Questo non funziona per https. Un semplice ascolto 443 default_server non funzionerà neanche perché l'handshake ssl si verifica prima di tutto e nginx si guasterà prima di restituire 444. Una soluzione che devo ancora provare ma che dovrebbe funzionare è creare un certificato autofirmato per il server https predefinito e optinalmente reindirizzare a http per evitare errori del browser.
Simon Bengtsson,

Il biglietto nginx per fornire un buon modo per rifiutare le connessioni SSL è qui . Offrono anche una soluzione alternativa , impostazione ssl_ciphers aNULL;.
nh2

Si noti la soluzione che ho citato si romperà clienti HTTPS non SNI-grado (come nginx proprio proxy_pass, a meno che non si imposta proxy_ssl_server_name on;) di raggiungere tutti gli altri server_names(in modo sostanzialmente rompere i legittimi server_names per porta 443 che non vuole lasciar passare). Vedi trac.nginx.org/nginx/ticket/195#comment:11 per i dettagli.
nh2

4

Basta definire vhost predefinito che punterà alla directory con file index.html vuoto.

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

e posiziona l'indice vuoto in / var / www / segnaposto


catturerà ogni richiesta che non raggiunge nessuno dei tuoi nomi di dominio e la risposta con una pagina vuota.
Wojciechz,

Non puoi semplicemente return '';invece root...index?
Oriadam,

0

perché non negare tutto

server {
    listen       80 default_server;
    server_name  _;

    location / {
        deny    all;
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.