ความแตกต่างของ $ host และ $ http_host ใน Nginx คืออะไร


คำตอบ:


217

$hostเป็นตัวแปรของโมดูลคอร์

$ โฮสต์

ตัวแปรนี้เท่ากับบรรทัดโฮสต์ในส่วนหัวของคำขอหรือชื่อของเซิร์ฟเวอร์ที่ประมวลผลคำขอหากส่วนหัวโฮสต์ไม่พร้อมใช้งาน

ตัวแปรนี้อาจมีค่าที่แตกต่างจาก $ http_host ในกรณีเช่นนี้: 1) เมื่อส่วนหัวอินพุตโฮสต์ขาดหายไปหรือมีค่าว่างเปล่า $ host เท่ากับค่าของคำสั่ง server_name; 2) เมื่อค่าของ Host มีหมายเลขพอร์ต $ host จะไม่รวมหมายเลขพอร์ตนั้น ค่า $ host เป็นตัวพิมพ์เล็กเสมอตั้งแต่ 0.8.17

$http_hostก็เป็นตัวแปรของโมดูลเดียวกัน แต่คุณจะไม่พบมันด้วยชื่อนั้นเพราะมันถูกนิยามโดยทั่วไปว่า$http_HEADER( อ้างอิง )

$ http_HEADER

ค่าของส่วนหัวคำขอ HTTP HEADER เมื่อแปลงเป็นตัวพิมพ์เล็กและด้วย 'ขีดกลาง' ถูกแปลงเป็น 'ขีดล่าง' เช่น $ http_user_agent, $ http_referer ... ;


สรุป:

  • $http_hostเท่ากับHTTP_HOSTส่วนหัวคำขอเสมอ
  • $hostเท่ากับ$http_host, ตัวพิมพ์เล็กและไม่มีหมายเลขพอร์ต (ถ้ามี) ยกเว้นเมื่อHTTP_HOSTไม่อยู่หรือเป็นค่าว่าง ในกรณีนั้น$hostเท่ากับมูลค่าของserver_nameคำสั่งของเซิร์ฟเวอร์ที่ประมวลผลการร้องขอ

57
$ host เป็นคนแรกserver_nameที่ถูกกำหนดในบล็อกเซิร์ฟเวอร์ปัจจุบันโดยเฉพาะ หากคุณมีหลายรายการจะมีserver_nameเพียงรายการแรกเท่านั้น
Jonathan Vanasco

4
จริง ในความเป็นจริงมันเป็นเรื่องปกติที่จะกำหนด: server_name example.com www.example.com;
glarrain

คุณสามารถมีหลายserver_nameคำสั่งได้เช่นกัน ถ้าคุณมี regex ในอันแรกมันจะกลายเป็น$hostและสิ่งต่าง ๆ ที่น่าเกลียดเกิดขึ้นได้ระหว่างการเขียนกฎใหม่
Jonathan Vanasco

5
ที่ไม่$server_nameตัวแปรเท่ากับserver_nameค่าสั่งหรือชื่อเซิร์ฟเวอร์จริงที่ได้รับการคัดเลือกว่ามีหลายserver_nameคำสั่ง?
CMCDragonkai

1
@CMCDragonkai $server_nameจะเท่ากับค่าแรกที่ระบุด้วยคำสั่ง server_name เสมอ ตัวอย่างเช่นserver_name example.com one.example.com two.example.com;, $server_nameจะเป็น "example.com" โดยไม่คำนึงถึงโฮสต์ที่ผู้ใช้ระบุ ในความเป็นจริงหากคุณไม่มีdefault_serverโฮสต์อาจเป็นสิ่งที่แตกต่างอย่างสิ้นเชิง (เช่น example.org)
ATLief
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.