Najlepszy sposób, aby zapobiec domyślnemu serwerowi?


26

Mam kilka vhostów i chciałbym „wyłączyć” domyślny vhost, albo przez pustą stronę, stronę błędu, albo ogólnie w jakikolwiek sposób najbardziej efektywne wykorzystanie zasobów Nginx, jednocześnie umożliwiając dostęp innym vhostom poprzez predefiniowane domeny.

Odpowiedzi:


42

Zdefiniuj serwer domyślny, który zwraca kod HTTP 444 :

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

(Zwrócenie kodu błędu 4xx oznacza, że ​​żądania mogą być interpretowane przez klienta jako nieudane, a raczej pusta strona HTTP 200, ale całkowicie działaj Zaufaj mi .)


2
444 to niestandardowy kod specyficzny dla Nginx : „zwracany jest niestandardowy kod 444 specjalnego Nginx, który zamyka połączenie”
bzeaman,

2
To nie działa dla https. Prosty serwer default_server Listen 443 nie będzie działał, ponieważ najpierw nastąpi uzgadnianie ssl, a nginx wystąpi błąd przed zwróceniem 444. Jednym z rozwiązań, które muszę jeszcze wypróbować, ale powinno działać, aby utworzyć certyfikat z podpisem własnym dla domyślnego serwera https i opcjonalnie przekieruj na http, aby uniknąć błędów przeglądarki.
Simon Bengtsson,

Bilet nginx zapewniający dobry sposób na odrzucanie połączeń SSL znajduje się tutaj . Zapewniają również obejście , ustawienie ssl_ciphers aNULL;.
nh2

Zwróć uwagę, że obejście, o którym wspomniałem, spowoduje proxy_pass, że klienci HTTPS nieobsługujący SNI (tacy jak nginx , chyba że ustawisz proxy_ssl_server_name on;) nie będą mogli dotrzeć do żadnego innego server_names(tak więc zasadniczo złamią legalne parametry server_nameportu 443, które chcesz przepuścić). Szczegółowe informacje można znaleźć na stronie trac.nginx.org/nginx/ticket/195#comment:11 .
nh2

4

Wystarczy zdefiniować domyślny vhost, który będzie wskazywał katalog z pustym plikiem index.html.

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

i umieść pusty indeks w / var / www / placeholder


wyłapie każde żądanie, które nie trafi w żadną z twoich nazw domen, i odpowie pustą stroną.
wojciechz

Nie możesz po prostu return '';zamiast root...index?
oriadam

0

dlaczego nie po prostu zaprzeczyć wszystkim

server {
    listen       80 default_server;
    server_name  _;

    location / {
        deny    all;
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.