http host header คืออะไร?


122

เนื่องจากการเชื่อมต่อ TCP ถูกสร้างขึ้นแล้วเมื่อส่งคำขอ HTTP จึงทราบที่อยู่ IP และพอร์ตโดยปริยาย - การเชื่อมต่อ TCP คือ IP + พอร์ต แล้วทำไมเราถึงต้องการHostส่วนหัว? จำเป็นสำหรับกรณีที่มีโฮสต์หลายโฮสต์ที่แมปกับที่อยู่ IP โดยนัยในการเชื่อมต่อ TCP หรือไม่

คำตอบ:


144

hostหัวบอกเว็บเซิร์ฟเวอร์ที่โฮสต์เสมือนกับการใช้งาน (ถ้าตั้งค่า) คุณยังสามารถมีโฮสต์เสมือนเดียวกันได้โดยใช้นามแฝงหลายตัว(= โดเมนและโดเมนตัวแทน) ในกรณีนี้คุณยังคงมีความเป็นไปได้ที่จะอ่านส่วนหัวนั้นด้วยตนเองในเว็บแอปของคุณหากคุณต้องการให้ลักษณะการทำงานที่แตกต่างกันตามโดเมนต่างๆที่ระบุ เป็นไปได้เพราะในเว็บเซิร์ฟเวอร์ของคุณคุณสามารถ (และถ้าฉันไม่เข้าใจผิดคุณต้อง) ตั้งค่าvhost หนึ่งรายการให้เป็นโฮสต์เริ่มต้น vhost เริ่มต้นนี้ถูกใช้เมื่อใดก็ตามที่hostส่วนหัวไม่ตรงกับโฮสต์เสมือนที่กำหนดค่าไว้

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

แม้ว่าจะไม่ใช่ส่วนหนึ่งของคำถาม แต่ความจริงที่น่าสนใจ: ข้อกำหนดนี้ทำให้เกิดปัญหากับ SSL ในช่วงแรก ๆ เนื่องจากเว็บเซิร์ฟเวอร์ต้องส่งมอบใบรับรองที่ตรงกับโดเมนที่ไคลเอ็นต์แจ้งไว้ อย่างไรก็ตามเพื่อให้ทราบว่าจะใช้ใบรับรองใดเว็บเซิร์ฟเวอร์ควรทราบชื่อโฮสต์ที่ระบุแอดเดรสล่วงหน้า แต่เนื่องจากไคลเอนต์ส่งข้อมูลนั้นผ่านช่องทางเข้ารหัสเท่านั้น (ซึ่งหมายความว่า: หลังจากส่งใบรับรองไปแล้ว) เซิร์ฟเวอร์จึงต้องถือว่าคุณเรียกดูโฮสต์เริ่มต้น นั่นหมายถึงโดเมนที่มีการรักษาความปลอดภัย ssl หนึ่งรายการต่อการรวมที่อยู่ IP / พอร์ต

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

แม้ว่าเว็บเซิร์ฟเวอร์จะทราบชื่อโฮสต์จาก Server Name Indication แต่hostส่วนหัวจะไม่ล้าสมัยเนื่องจากข้อมูลการบ่งชี้ชื่อเซิร์ฟเวอร์จะใช้ภายในการจับมือ TLS เท่านั้น ด้วยการเชื่อมต่อที่ไม่ปลอดภัยจะไม่มีการระบุชื่อเซิร์ฟเวอร์เลยดังนั้นhostส่วนหัวจึงยังคงใช้ได้ (และจำเป็น)

ข้อเท็จจริงที่น่าสนใจอีกประการหนึ่ง: เว็บเซิร์ฟเวอร์ส่วนใหญ่ (ถ้าไม่ใช่ทั้งหมด) ปฏิเสธคำขอ http ของคุณหากไม่มีhostส่วนหัวเดียวแม้ว่าจะสามารถละเว้นได้เนื่องจากมีการกำหนดค่า vhost เริ่มต้นไว้เท่านั้น นั่นหมายถึงข้อมูลขั้นต่ำที่จำเป็นในคำขอ http- (get-) คือบรรทัดแรกที่มีMETHOD RESOURCEและPROTOCOL VERSIONและอย่างน้อยที่สุดก็คือhost- ส่วนหัวดังนี้:

GET /someresource.html HTTP/1.1
Host: www.example.com

ในเอกสาร MDN บน Host-Headerพวกเขาใช้วลีนี้:

ต้องส่งฟิลด์ส่วนหัวของโฮสต์ในข้อความคำขอ HTTP / 1.1 ทั้งหมด รหัสสถานะ 400 (คำขอไม่ถูกต้อง) จะถูกส่งไปยังข้อความคำขอ HTTP / 1.1 ใด ๆ ที่ไม่มีฟิลด์ส่วนหัวของโฮสต์หรือมีมากกว่าหนึ่ง

ดังกล่าวโดย Darrel มิลเลอร์รายละเอียดที่สมบูรณ์สามารถพบได้ในRFC7230


คำตอบที่ดี. คุณเขียนว่า "เป็นไปได้เพราะในเว็บเซิร์ฟเวอร์ของคุณคุณสามารถ (และถ้าฉันไม่เข้าใจผิดคุณต้อง) ตั้งค่าหนึ่ง vhost ให้เป็นโฮสต์เริ่มต้น vhost เริ่มต้นนี้จะใช้เมื่อใดก็ตามที่ส่วนหัวของโฮสต์ไม่ตรงกับเสมือนที่กำหนดค่าไว้ เจ้าภาพ." ฉันต้องการตรวจสอบใน RFC7230 แต่ไม่พบvhostเพียง 3 เหตุการณ์ใกล้เคียงที่virtual hostมีความหมายไม่ใกล้เคียงกับวลีของคุณและ 12 สำหรับdefaultพอร์ตส่วนใหญ่
Alexei Martianov

เกี่ยวกับโฮสต์เท่านั้นว่า: "ถ้าไม่เช่นนั้นหากฟิลด์ส่วนหัวของโฮสต์มีค่าฟิลด์ที่ไม่ว่างเปล่าคอมโพเนนต์ของหน่วยงานจะเหมือนกับค่าฟิลด์โฮสต์" - ไม่ใช่ IMHO เหมือนกัน คุณช่วยชี้ให้ฉันชี้ใน RFC ได้ไหม
Alexei Martianov

ด้านปฏิบัติ: ไปยังเซิร์ฟเวอร์บางตัวฉันส่ง POST พร้อมโฮสต์ส่วนหัว = ชื่อโดเมนและรับ 200 (ตกลง) ฉันส่งส่วนหัวของโฮสต์ที่เปลี่ยนไปและรับ 404 (ไม่พบ) อาจหมายความว่าเซิร์ฟเวอร์ไม่ได้รับby the bookการกำหนดค่าอย่างถูกต้อง (ทั้งหมด) หรือไม่?
Alexei Martianov

เนื่องจากไม่สามารถแก้ไขความคิดเห็นได้: quote ใน 2nd เป็นdefaultคำที่อยู่ใกล้โดยการค้นหาOtherwise, the authority component is assigned the default name configured for the server
Alexei Martianov

แปลก. ทั้ง 3 เหตุการณ์virtual hostพบได้โดยการค้นหาของฉันในtools.ietf.org/html/rfc7230Appendix A. HTTP Version Historyอยู่ใน ดูเหมือนว่าการค้นหาของคุณจะพบสิ่งอื่น ๆ
Alexei Martianov

30

ฉันขอแนะนำให้ไปที่แหล่งข้อมูลที่เชื่อถือได้เสมอเมื่อพยายามทำความเข้าใจความหมายและวัตถุประสงค์ของส่วนหัว HTTP

ช่องส่วนหัว "โฮสต์" ในคำขอจะให้ข้อมูลโฮสต์และพอร์ต
จาก URI เป้าหมายทำให้เซิร์ฟเวอร์ต้นทางสามารถ
แยกความแตกต่างระหว่างทรัพยากรในขณะที่ให้บริการคำขอ
ชื่อโฮสต์หลายชื่อบนที่อยู่ IP เดียว

https://tools.ietf.org/html/rfc7230#section-5.4

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