web-dev-qa-db-fra.com

Quelle est la différence entre nom_serveur _ et nom_serveur "" dans Nginx?

Je veux définir un bloc de serveur passe-partout par défaut pour gérer tous les noms d'hôte qui ne correspondent pas à mon _ server_name valeurs. Mais je ne sais pas lequel utiliser.

server {
    listen 80 default_server;
    server_name ""; # this is by default if no server_name specified
    return 444;
}

ou

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

J'ai testé et ils semblent se comporter également. Y a-t-il une différence entre eux?

8
NARKOZ

Réponse courte: Oui, il y a une différence entre server_name ""; et server_name _;

Longue réponse: server_name ""; définit une correspondance pour une demande sans Host en-tête depuis le 0.8.48 et il est supporté depuis le 0.7.12.

https://nginx.org/en/docs/http/request_processing.html

Si les demandes sans le champ d'en-tête "Host" ne doivent pas être autorisées, un serveur qui supprime simplement les demandes peut être défini:

server {
    listen      80;
    server_name "";
    return      444;
}

Ici, le nom du serveur est défini sur une chaîne vide qui correspondra aux demandes sans le champ d'en-tête "Host", et un code non standard 444 spécial de nginx est renvoyé qui ferme la connexion.

D'un autre côté, server_name _; définit un nom de serveur invalide qui ne croise jamais avec un vrai nom. C'est juste une non-correspondance. Donc, en cas d'absence de correspondance, nginx sélectionnera le premier bloc du serveur {} et l'utilisera.

Pour conclure, vous pouvez utiliser server_name _; pour le bloc serveur fourre-tout mais pas server_name "";.

Référence - https://stackoverflow.com/questions/9454764/nginx-server-name-wildcard-or-catch-allhttps://blog.gahooa.com/2013/ 08/21/nginx-comment-spécifier-un-serveur-par-défaut /

12
Pramod Singh