อะไรคือความแตกต่างระหว่างตัวแปร Nginx $ host, $ http_host และ $ server_name?


42

ความแตกต่างระหว่างสามตัวแปร Nginx คืออะไร$host, $http_hostและ$server_name?

ฉันมีกฎการเขียนซ้ำที่ฉันไม่แน่ใจว่าควรใช้อันไหน:

location = /vb/showthread.php {
    # /vb/showthread.php?50271-What-s-happening&p=846039
    if ($arg_p) {
        return 301 $scheme://$host/forum/index.php?posts/$arg_p/;
        }

ฉันกำลังมองหาคำตอบที่ไม่เพียง แต่พูดว่า 'ใช้ตัวแปร ___ ในกฎการเขียนซ้ำของคุณ' แต่ยังอธิบายถึงความแตกต่างทางทฤษฎีระหว่างพวกเขาด้วย


ฉันตระหนักต่อมาผมไม่จำเป็นต้องแม้กระทั่งการระบุ$schemeและ$host... return 301 /forum/index.php?posts/$arg_p/;การทำงานที่ดี
Jeff Widman

เบราว์เซอร์ส่วนใหญ่จะทำงานกับ URL สัมพัทธ์ในการเปลี่ยนเส้นทาง แต่มาตรฐาน ( w3.org/Protocols/rfc2616/rfc2616-sec14.html ) ต้องใช้ url แบบสัมบูรณ์ในLocationส่วนหัว
คธูลู

คำตอบ:


54

คุณควรใช้เกือบทุก$hostครั้งเนื่องจากเป็นสิ่งเดียวที่รับประกันว่ามีเหตุผลที่เหมาะสมไม่ว่าตัวแทนผู้ใช้จะทำงานอย่างไรเว้นแต่ว่าคุณต้องการความหมายของตัวแปรอื่น ๆ

ความแตกต่างได้อธิบายไว้ในเอกสารประกอบของ nginx :

  • $host มี "ในลำดับความสำคัญนี้: ชื่อโฮสต์จากบรรทัดคำขอหรือชื่อโฮสต์จากฟิลด์ส่วนหัวคำขอ 'โฮสต์' หรือชื่อเซิร์ฟเวอร์ที่ตรงกับคำขอ"
  • $http_host มีเนื้อหาของฟิลด์ส่วนหัว HTTP "โฮสต์" หากมีอยู่ในคำขอ
  • $server_nameมีserver_nameโฮสต์เสมือนที่ประมวลผลคำขอตามที่กำหนดไว้ในการกำหนดค่า nginx หาก a serverมีหลายserver_names จะมีเพียงอันแรกเท่านั้นที่ปรากฏในตัวแปรนี้

เนื่องจากเป็นเรื่องที่ถูกกฎหมายสำหรับตัวแทนผู้ใช้ในการส่งชื่อโฮสต์ในบรรทัดคำขอแทนที่จะอยู่ในส่วนหัว Host: แม้ว่าจะไม่ค่อยทำยกเว้นเมื่อเชื่อมต่อกับพร็อกซี่คุณจะต้องพิจารณาเรื่องนี้

คุณต้องคำนึงถึงกรณีที่ตัวแทนผู้ใช้ไม่ได้ส่งชื่อโฮสต์เลยเช่นคำขอ HTTP / 1.0 โบราณและซอฟต์แวร์ที่เขียนไม่ดีทันสมัย คุณอาจทำเช่นนั้นโดยโอนไปยังโฮสต์เสมือน catch-all ซึ่งไม่ได้ให้บริการอะไรถ้าคุณให้บริการหลายเว็บไซต์หรือถ้าคุณมีเพียงเว็บไซต์เดียวบนเซิร์ฟเวอร์ของคุณคุณอาจประมวลผลทุกอย่างผ่านโฮสต์เสมือนเดียว . ในกรณีหลังนี้คุณต้องคำนึงถึงเรื่องนี้ด้วย

เฉพาะ$hostตัวแปรบัญชีสำหรับสิ่งที่เป็นไปได้ทั้งหมดที่ตัวแทนผู้ใช้อาจทำเมื่อสร้างคำขอ HTTP


2
ในทางตรงกันข้ามความ$server_nameปลอดภัยเมื่อHost:สนามจาก UA อาจมีเนื้อหาโดยพลการ
คธูลู

1
$ http_host ถูกเปลี่ยนชื่อเป็น $ hostname หรือไม่ ฉันไม่พบตัวแปรดังกล่าวใน Nginx doc $ hostname เป็นชื่อที่ใกล้เคียงที่สุดที่ฉันเดา
darkbaby123

3
@ darkbaby123 ไม่มันไม่ได้เปลี่ยนชื่อเป็นอะไรเลย ดูเอกสาร
Michael Hampton

1
อ่าตอนนี้ฉันเข้าใจความหมายของตัวแปร http_ <name> ขอขอบคุณ!
darkbaby123

0

ฉันต้องการเพิ่มจุดสำคัญอื่นที่ไม่ได้กล่าวถึงในคำตอบที่ยอมรับ

$hostจะไม่ได้มีจำนวนพอร์ตขณะ$http_hostDO ได้แก่ หมายเลขพอร์ต

แก้ไข : ไม่เสมอไป

ฉันตั้งค่าส่วนหัว "add_header Y-blog-http_host" $ http_host "เสมอ;"

จากนั้นcurl -I -L domain.com:80(หรือ 443) และส่วนหัวจะไม่แสดงหมายเลขพอร์ตเลย ตรวจสอบกับ nginx- พิเศษ 1.10.3 เป็นเพราะมันเป็นพอร์ต http (s) ทั่วไปหรือการกำหนดค่า nginx? ความคิดเห็นนี้เพียงเพื่อบอกว่าสิ่งต่าง ๆ ไม่ได้เป็นไปตามที่คุณคิด


0

ฉันยังดิ้นรนกับสิ่งนี้ในขณะที่ มันชัดเจนเมื่อฉันเข้าใจว่า $ http_XXXXX อ้างถึงตัวแปรส่วนหัวที่ประกาศไว้ทั้งหมด

ดังนั้น $ http_user_agent, $ http_referer จึงเป็น "USER AGENT", "REFERER" อ้างอิงในกรณีที่ต่ำกว่าและขีดล่าง สิ่งนี้อธิบายให้ฉันทราบว่า $ http_upgrade นั้นมาจากไหนในตัวอย่างการกำหนดค่า NGINX จำนวนมาก

อ่านจากhttps://stackoverflow.com/questions/15414810/whats-the-difference-of-host-and-http-host-in-nginx

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