nginx: urutan resolusi "server_name"?

8

Saya memiliki beberapa "server" blok di nginx.conf saya. Dokumentasi tampaknya salah tentang urutan pencocokan server_name.

Conf saya terlihat seperti:

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
}

Saya mencoba mencari tahu mengapa permintaan dengan host = www.sub.domain.com pergi ke tempat yang benar (server kedua), ketika dokumentasi menunjukkan itu harus pergi ke server pertama.

Dokumentasi Nginx menunjukkan bahwa blok server dicentang "dalam urutan" untuk kecocokan, artinya setiap permintaan dengan host * .sub.domain.com harus ditangkap oleh server pertama, bukan server kedua. ( http://wiki.nginx.org/HttpCoreModule#server_name )

Juga, * wildcard cocok dengan sejumlah bagian subdomain, jadi * .domain.com cocok dengan www.sub.domain.com. ( http://nginx.org/en/docs/http/server_names.html#wildcard_names )

Jika dokumentasi ini salah, apa urutan pencocokan yang sebenarnya?

pengguna41356
sumber

Jawaban:

18

Dari dokumentasi nginx ( http://nginx.org/en/docs/http/server_names.html ):

Saat mencari server virtual dengan nama, jika nama cocok dengan lebih dari satu varian yang ditentukan, mis. Nama wildcard dan pencocokan ekspresi reguler, varian pencocokan pertama akan dipilih, dengan urutan prioritas sebagai berikut:

  1. nama yang tepat
  2. nama wildcard terpanjang dimulai dengan tanda bintang, misalnya "* .example.org"
  3. nama wildcard terpanjang yang diakhiri dengan tanda bintang, misalnya "mail. *"
  4. pertama pencocokan ekspresi reguler (dalam urutan tampilan dalam file konfigurasi)
Justin L. Franks
sumber
2

Dokumentasi mengatakan:

Membandingkan tajuk Host permintaan HTTP yang masuk terhadap server {...} blok dalam file konfigurasi Nginx dan memilih yang pertama yang cocok.

Apa yang tampaknya terjadi adalah ia memilih pasangan terbaik dari semua serverblok, jadi www.sub.domain.com, cocok dengan konfigurasi kedua. Saya tidak memiliki dokumentasi untuk mendukungnya, jadi Anda dapat menjalankan beberapa tes untuk mengkonfirmasi perilaku itu. Ada juga dokumen ini yang berbicara tentang resolusi nama.

coredump
sumber