nginx: kolejność rozwiązywania „nazwa_serwera”?

8

Mam wiele bloków „serwerowych” w moim pliku nginx.conf. Dokumentacja wydaje się nieprawidłowa w zakresie kolejności dopasowywania nazw serwerów.

Moje conf wygląda mniej więcej tak:

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
}

Próbuję dowiedzieć się, dlaczego żądania z hostem = www.sub.domain.com trafiają do właściwego miejsca (drugi serwer), gdy dokumentacja wskazuje, że powinno być kierowane do pierwszego serwera.

Dokumentacja Nginx wskazuje, że bloki serwera są sprawdzane „w kolejności” pod kątem zgodności, co oznacza, że ​​każde żądanie z hostem * .sub.domain.com powinno zostać przechwycone przez pierwszy serwer, a nie drugi serwer. ( http://wiki.nginx.org/HttpCoreModule#server_name )

Ponadto * symbol wieloznaczny pasuje do dowolnej liczby części poddomeny, więc * .domain.com pasuje do www.sub.domain.com. ( http://nginx.org/en/docs/http/server_names.html#wildcard_names )

Jeśli ta dokumentacja jest nieprawidłowa, jakie jest właściwe dopasowanie?

użytkownik41356
źródło

Odpowiedzi:

18

Z dokumentacji nginx ( http://nginx.org/en/docs/http/server_names.html ):

Podczas wyszukiwania serwera wirtualnego według nazwy, jeśli nazwa pasuje do więcej niż jednego z określonych wariantów, np. Zarówno nazwa wieloznaczna, jak i dopasowanie do wyrażenia regularnego, zostanie wybrany pierwszy pasujący wariant, w następującej kolejności:

  1. dokładne imię
  2. najdłuższa nazwa wieloznaczna rozpoczynająca się od gwiazdki, np. „* .example.org”
  3. najdłuższa nazwa z symbolem wieloznacznym kończąca się gwiazdką, np. „mail. *”
  4. pierwsze pasujące wyrażenie regularne (w kolejności pojawiania się w pliku konfiguracyjnym)
Justin L. Franks
źródło
2

Dokumentacja mówi:

Porównuje nagłówek Host przychodzącego żądania HTTP z blokami serwera {...} w plikach konfiguracyjnych Nginx i wybiera pierwszy pasujący.

Wydaje się, że dzieje się tak, że wybiera najlepsze dopasowanie ze wszystkich serverbloków, więc www.sub.domain.comdopasowanie drugiej konfiguracji. Nie mam dokumentacji, aby to zrobić, więc możesz przeprowadzić testy, aby potwierdzić to zachowanie. Jest też ten dokument mówiący o rozpoznawaniu nazw.

rdzeń rdzeniowy
źródło