nginx: ordre de résolution «nom_serveur»?

8

J'ai plusieurs blocs "serveur" dans mon nginx.conf. La documentation semble erronée sur l'ordre dans lequel la correspondance nom_serveur a lieu.

Ma conf ressemble à quelque chose comme:

server {
  listen 80
  server_name domain.com *.domain.com

  # do stuff
}

server {
  listen 80
  server_name sub.domain.com *.sub.domain.com

  # do something else
}

J'essaie de comprendre pourquoi les demandes avec host = www.sub.domain.com vont au bon endroit (le deuxième serveur), lorsque la documentation indique qu'elle devrait aller au premier serveur.

La documentation Nginx indique que les blocs serveur sont vérifiés "dans l'ordre" pour les correspondances, ce qui signifie que toute demande avec l'hôte * .sub.domain.com doit être interceptée par le premier serveur, pas le deuxième serveur. ( http://wiki.nginx.org/HttpCoreModule#server_name )

De plus, le caractère générique * correspond à n'importe quel nombre de parties de sous-domaine, donc * .domain.com correspond à www.sub.domain.com. ( http://nginx.org/en/docs/http/server_names.html#wildcard_names )

Si cette documentation est erronée, quel est l'ordre de correspondance réel?

user41356
la source

Réponses:

18

Dans la documentation nginx ( http://nginx.org/en/docs/http/server_names.html ):

Lorsque vous recherchez un serveur virtuel par nom, si le nom correspond à plusieurs des variantes spécifiées, par exemple à la fois le nom générique et la correspondance d'expression régulière, la première variante correspondante sera choisie, dans l'ordre de priorité suivant:

  1. nom exact
  2. nom générique le plus long commençant par un astérisque, par exemple «* .example.org»
  3. nom générique le plus long se terminant par un astérisque, par exemple "mail. *"
  4. première expression régulière correspondante (par ordre d'apparition dans un fichier de configuration)
Justin L. Franks
la source
2

La documentation dit:

Compare l'en-tête Host de la requête HTTP entrante avec les blocs {...} du serveur dans les fichiers de configuration Nginx et sélectionne le premier qui correspond.

Ce qui semble se produire, c'est qu'il choisit la meilleure correspondance parmi tous les serverblocs, donc www.sub.domain.com, en faisant correspondre la deuxième configuration. Je n'ai aucune documentation pour le sauvegarder, vous pouvez donc exécuter des tests pour confirmer ce comportement. Il y a aussi ce document qui parle de résolution de nom.

coredump
la source