Beste Weg, um Standard-Server zu verhindern?

26

Ich habe eine Reihe von vhosts und möchte den Standard-vhost entweder über eine leere Seite, eine Fehlerseite oder allgemein über die effizienteste Nutzung der Nginx-Ressourcen "ausschalten", während nur anderen vhosts der Zugriff über gestattet wird vordefinierte Domänen.

DanH
quelle

Antworten:

42

Definieren Sie einen Standardserver , der einen HTTP 444- Code zurückgibt :

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

(Das Zurückgeben eines 4xx-Fehlercodes bedeutet, dass Anforderungen von einem Client als eine nicht erfolgreiche Anforderung interpretiert werden können, statt als eine leere HTTP 200-Seite, die jedoch vollständig funktioniert hat .)

Rob Howard
quelle
2
444 ist ein nicht standardmäßiger nginx- spezifischer Code: "Der nicht standardmäßige Code 444 eines speziellen nginx wird zurückgegeben, der die Verbindung schließt"
bzeaman
2
Dies funktioniert nicht für https. Ein einfaches Listening 443 default_server funktioniert auch nicht, da der ssl-Handshake zuallererst stattfindet und nginx einen Fehler ausgibt, bevor 444 zurückgegeben wird. Eine Lösung, die ich bisher noch nicht ausprobiert habe, sollte jedoch darin bestehen, ein selbstsigniertes Zertifikat für den Standard-https-Server und optional zu erstellen Umleiten zu http, um Browserfehler zu vermeiden.
Simon Bengtsson
Das Nginx-Ticket, mit dem Sie SSL-Verbindungen ablehnen können, finden Sie hier . Sie bieten auch eine Abhilfe , Einstellung ssl_ciphers aNULL;.
nh2
Beachten Sie, dass die erwähnte Problemumgehung dazu führt, dass nicht SNI-fähige HTTPS-Clients (wie die von nginx proxy_pass, sofern Sie dies nicht festlegen proxy_ssl_server_name on;) keine anderen erreichen server_names(also im Wesentlichen die legitimen server_names für Port 443 unterbrechen, die Sie durchlassen möchten). Weitere Informationen finden Sie unter trac.nginx.org/nginx/ticket/195#comment:11 .
nh2
4

Definieren Sie einfach den Standard- vhost, der auf das Verzeichnis mit der leeren Datei index.html verweist.

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

und platzieren Sie einen leeren Index in / var / www / placeholder

wojciechz
quelle
Es fängt jede Anfrage ab, die keinen Ihrer Domainnamen trifft, und antwortet mit einer leeren Seite.
Wojciechz
Kannst du nicht einfach return '';statt root...index?
Oriadam
0

warum nicht einfach alles leugnen

server {
    listen       80 default_server;
    server_name  _;

    location / {
        deny    all;
    }
}
Joel Ma
quelle