nginx: Auflösungsreihenfolge "Servername"?

8

Ich habe mehrere "Server" -Blöcke in meiner nginx.conf. Die Dokumentation scheint in Bezug auf die Reihenfolge, in der der Servername-Abgleich stattfindet, falsch zu sein.

Mein Conf sieht ungefähr so ​​aus:

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
}

Ich versuche herauszufinden, warum Anfragen mit host = www.sub.domain.com an den richtigen Ort (den zweiten Server) gehen, wenn die Dokumentation angibt, dass sie an den ersten Server gehen sollen.

Aus der Nginx-Dokumentation geht hervor, dass die Serverblöcke "in der richtigen Reihenfolge" auf Übereinstimmungen überprüft werden. Dies bedeutet, dass jede Anfrage an den Host * subdomain.com vom ersten Server und nicht vom zweiten Server abgefangen werden sollte. ( http://wiki.nginx.org/HttpCoreModule#server_name )

Außerdem entspricht der Platzhalter * einer beliebigen Anzahl von Subdomain-Teilen, sodass * .domain.com mit www.sub.domain.com übereinstimmt. ( http://nginx.org/en/docs/http/server_names.html#wildcard_names )

Wenn diese Dokumentation falsch ist, wie lautet die tatsächliche Übereinstimmungsreihenfolge?

user41356
quelle

Antworten:

18

Aus der Nginx-Dokumentation ( http://nginx.org/en/docs/http/server_names.html ):

Wenn bei der Suche nach einem virtuellen Server nach Namen der Name mit mehr als einer der angegebenen Varianten übereinstimmt, z. B. sowohl der Platzhaltername als auch die Übereinstimmung mit regulären Ausdrücken, wird die erste übereinstimmende Variante in der folgenden Rangfolge ausgewählt:

  1. genauer Name
  2. längster Platzhaltername beginnend mit einem Sternchen, z. B. "* .example.org"
  3. längster Platzhaltername, der mit einem Sternchen endet, z. B. "mail. *"
  4. erster übereinstimmender regulärer Ausdruck (in der Reihenfolge des Auftretens in einer Konfigurationsdatei)
Justin L. Franks
quelle
2

Die Dokumentation sagt:

Vergleicht den Host-Header der eingehenden HTTP-Anforderung mit den Serverblöcken {...} in den Nginx-Konfigurationsdateien und wählt den ersten passenden aus.

Was zu passieren scheint, ist, dass es die beste Übereinstimmung aus allen serverBlöcken auswählt , also www.sub.domain.commit der zweiten Konfiguration übereinstimmt. Ich habe keine Dokumentation, um dies zu sichern, daher können Sie einige Tests durchführen, um dieses Verhalten zu bestätigen. Es gibt auch dieses Dokument über die Namensauflösung.

Core-Dump
quelle