nginx: คำสั่งแก้ปัญหา“ server_name” หรือไม่


8

ฉันมีบล็อก "เซิร์ฟเวอร์" หลายรายการใน nginx.conf ของฉัน เอกสารดูเหมือนผิดพลาดเกี่ยวกับลำดับการจับคู่ server_name

ความเชื่อมั่นของฉันดูเหมือนว่า:

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
}

ฉันกำลังพยายามหาสาเหตุที่คำขอกับ host = www.sub.domain.com กำลังไปยังตำแหน่งที่ถูกต้อง (เซิร์ฟเวอร์ตัวที่สอง) เมื่อเอกสารระบุว่าควรไปที่เซิร์ฟเวอร์เครื่องแรก

เอกสารประกอบของ Nginx ระบุว่าบล็อกเซิร์ฟเวอร์ได้รับการตรวจสอบ "ตามลำดับ" สำหรับการจับคู่หมายถึงคำขอใด ๆ กับโฮสต์ * .sub.domain.com ควรถูกตรวจพบโดยเซิร์ฟเวอร์เครื่องแรกไม่ใช่เซิร์ฟเวอร์ที่สอง ( http://wiki.nginx.org/HttpCoreModule#server_name )

นอกจากนี้ * wildcard จะจับคู่ส่วนย่อยจำนวนเท่าใดก็ได้ดังนั้น * .domain.com จะจับคู่ www.sub.domain.com ( http://nginx.org/en/docs/http/server_names.html#wildcard_names )

หากเอกสารนี้ผิดลำดับการจับคู่ที่แท้จริงคืออะไร

คำตอบ:


18

จากเอกสาร nginx ( http://nginx.org/en/docs/http/server_names.html ):

เมื่อค้นหาเซิร์ฟเวอร์เสมือนตามชื่อหากชื่อตรงกับหนึ่งในตัวแปรที่ระบุเช่นชื่อ wildcard และนิพจน์ทั่วไปการจับคู่นิพจน์ทั่วไปตัวแปรการจับคู่แรกจะถูกเลือกตามลำดับความสำคัญต่อไปนี้:

  1. ชื่อที่แน่นอน
  2. ชื่อตัวแทนที่ยาวที่สุดที่ขึ้นต้นด้วยเครื่องหมายดอกจันเช่น“ * .example.org”
  3. ชื่อตัวแทนที่ยาวที่สุดที่ลงท้ายด้วยเครื่องหมายดอกจันเช่น“ mail. *”
  4. การจับคู่นิพจน์ทั่วไปแรก (ตามลำดับที่ปรากฏในไฟล์กำหนดค่า)

2

เอกสารบอกว่า:

เปรียบเทียบส่วนหัว Host ของคำขอ HTTP ขาเข้ากับบล็อกเซิร์ฟเวอร์ {... } ในไฟล์กำหนดค่า Nginx และเลือกอันแรกที่ตรงกับ

สิ่งที่ดูเหมือนจะเกิดขึ้นคือมันเลือกการจับคู่ที่ดีที่สุดจากserverบล็อคทั้งหมดดังนั้นการwww.sub.domain.comจับคู่การกำหนดค่าที่สอง ฉันไม่มีเอกสารประกอบในการสำรองข้อมูลดังนั้นคุณอาจทำการทดสอบเพื่อยืนยันพฤติกรรมนั้น นอกจากนี้ยังมีเอกสารนี้พูดคุยเกี่ยวกับการแก้ไขชื่อ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.