Le meilleur moyen d'empêcher le serveur par défaut?

26

J'ai un certain nombre de vhosts, et je voudrais "désactiver" le vhost par défaut, soit par une page vierge, une page d'erreur, ou généralement quelle que soit l'utilisation la plus efficace des ressources de Nginx, tout en autorisant uniquement l'accès à d'autres vhosts via domaines prédéfinis.

DanH
la source

Réponses:

42

Définissez un serveur par défaut qui renvoie un code HTTP 444 :

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

(Le renvoi d'un code d'erreur 4xx signifie que les demandes peuvent être interprétées par un client comme une demande infructueuse, plutôt comme une page vide HTTP 200 mais totalement fonctionnelle Faites-moi confiance .)

Rob Howard
la source
2
444 est un code spécifique nginx non standard : "un
bzeaman
2
Cela ne fonctionne pas pour https. Une simple écoute 443 default_server ne fonctionnera pas non plus car la poignée de main ssl se produit d'abord et nginx générera une erreur avant de retourner 444. Une solution que je n'ai pas encore essayée mais qui devrait fonctionner est de créer un certificat auto-signé pour le serveur https par défaut et en option redirigez vers http pour éviter toute erreur de navigateur.
Simon Bengtsson
Le ticket nginx pour fournir un bon moyen de refuser les connexions SSL est ici . Ils fournissent également une solution de contournement , un paramètre ssl_ciphers aNULL;.
nh2
Notez la solution de contournement je l' ai mentionné cassera non-SNI capables clients HTTPS (comme nginx propre proxy_pass, à moins que vous définissez proxy_ssl_server_name on;) d'atteindre tout autre server_names(pause pour l' essentiel les légitimes server_names pour le port 443 que vous ne voulez laisser passer). Voir trac.nginx.org/nginx/ticket/195#comment:11 pour plus de détails.
nh2
4

Définissez simplement le vhost par défaut qui pointera vers le répertoire avec un fichier index.html vierge.

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

et placez un index vide dans / var / www / placeholder

wojciechz
la source
il interceptera chaque demande qui ne touche aucun de vos noms de domaine et répondra avec une page vierge.
wojciechz
Tu ne peux pas juste return '';au lieu de root...index?
oriadam
0

pourquoi ne pas tout nier

server {
    listen       80 default_server;
    server_name  _;

    location / {
        deny    all;
    }
}
Joel Ma
la source