โดยทั่วไป: เบราว์เซอร์มีชื่อโดเมนในคำขอ HTTP ดังนั้นเว็บเซิร์ฟเวอร์จะทราบว่ามีการร้องขอโดเมนใดและสามารถตอบสนองได้
คำขอ HTTP
นี่คือวิธีที่คำขอ HTTP ทั่วไปของคุณเกิดขึ้น:
ผู้ใช้ให้ URL http://host:port/path
ที่ในรูปแบบ
เบราว์เซอร์สารสกัดจากส่วนที่โฮสต์ (โดเมน) ของ URL และแปลมันเป็นที่อยู่ IP ถ้าจำเป็นในกระบวนการที่เรียกว่าการแก้ปัญหาชื่อ การแปลนี้สามารถเกิดขึ้นได้ผ่าน DNS แต่ไม่จำเป็นต้อง (ตัวอย่างเช่นhosts
ไฟล์โลคัลบนระบบปฏิบัติการทั่วไปข้าม DNS)
เบราว์เซอร์จะเปิดการเชื่อมต่อ TCP ไปยังพอร์ตที่ระบุหรือกำหนดค่าเริ่มต้นเป็นพอร์ต 80 บนที่อยู่ IP นั้น
เบราว์เซอร์ส่งคำขอ HTTP สำหรับ HTTP / 1.1 ดูเหมือนว่า:
GET /path HTTP/1.1
Host: example.com
( Host
ส่วนหัวเป็นมาตรฐานและจำเป็นต้องใช้ใน HTTP / 1.1 ซึ่งไม่ได้ระบุไว้ในข้อมูลจำเพาะ HTTP / 1.0 แต่เซิร์ฟเวอร์บางตัวรองรับอยู่ดี)
จากที่นี่เว็บเซิร์ฟเวอร์มีข้อมูลหลายส่วนที่สามารถใช้ในการตัดสินใจว่าควรตอบสนองอย่างไร โปรดทราบว่าเป็นไปได้ที่เว็บเซิร์ฟเวอร์เดียวจะเชื่อมโยงกับที่อยู่ IP หลายแห่ง
- ที่อยู่ IP ที่ร้องขอจากซ็อกเก็ต TCP
- ที่อยู่ IP ของไคลเอนต์ก็มีให้บริการเช่นกัน แต่ไม่ค่อยมีใครใช้ - บางครั้งสำหรับการบล็อก / กรอง
- พอร์ตที่ร้องขอจากซ็อกเก็ต TCP
- ชื่อโฮสต์ที่ร้องขอตามที่ระบุใน
Host
ส่วนหัวโดยเบราว์เซอร์ในคำขอ HTTP
- เส้นทางที่ร้องขอ
- ส่วนหัวอื่น ๆ (คุกกี้ ฯลฯ )
ในขณะที่คุณดูเหมือนจะได้สังเกตเห็นที่พบมากที่สุดร่วมกันพื้นที่ติดตั้งวันนี้ทำให้หลายเว็บไซต์เกี่ยวกับที่อยู่ IP เดียว: การรวมกันพอร์ตเหลือแค่Host
ความแตกต่างระหว่างเว็บไซต์
นี้เป็นที่รู้จักกันว่าเป็นชื่อที่ใช้โฮสต์เสมือนใน Apache ที่ดินขณะ Nginx เรียกพวกเขาชื่อเซิร์ฟเวอร์ในเซิร์ฟเวอร์บล็อกและ IIS ชอบเซิร์ฟเวอร์เสมือน
แล้ว HTTPS ล่ะ?
HTTPS แตกต่างกันเล็กน้อย ทุกอย่างเหมือนกันกับการสร้างการเชื่อมต่อ TCP แต่หลังจากนั้นต้องสร้างช่องสัญญาณ TLS ที่เข้ารหัส เป้าหมายคือไม่รั่วไหลข้อมูลใด ๆ เกี่ยวกับคำขอ
ในการตรวจสอบว่าเซิร์ฟเวอร์เป็นเจ้าของโดเมนนี้จริงเซิร์ฟเวอร์ต้องส่งใบรับรองที่ลงนามโดยบุคคลที่สามที่เชื่อถือได้ เบราว์เซอร์จะเปรียบเทียบใบรับรองนี้กับโดเมนที่ขอ
สิ่งนี้นำเสนอปัญหา เซิร์ฟเวอร์รู้ได้อย่างไรว่าจะส่งใบรับรองโฮสต์ (เว็บไซต์) ใดถ้าจำเป็นต้องทำสิ่งนี้ก่อนที่จะได้รับคำขอ HTTP
เดิมนี้ได้รับการแก้ไขโดยมีที่อยู่ IP (หรือพอร์ต) เฉพาะสำหรับทุกเว็บไซต์ที่ต้องการ HTTPS เห็นได้ชัดว่านี่เป็นปัญหาเมื่อเราเริ่มใช้ที่อยู่ IPv4 หมด
ป้อนSNI (บ่งชี้ชื่อเซิร์ฟเวอร์) ขณะนี้เบราว์เซอร์ส่งชื่อโฮสต์ในระหว่างการเจรจา TLS ดังนั้นเซิร์ฟเวอร์มีข้อมูลนี้เร็วพอที่จะส่งใบรับรองที่ถูกต้อง ที่ฝั่งเซิร์ฟเวอร์การกำหนดค่าจะคล้ายกับการกำหนดค่าโฮสต์เสมือน HTTP
ข้อเสียคือชื่อโฮสต์จะถูกส่งเป็นข้อความธรรมดาก่อนการเข้ารหัสและมีการรั่วไหลของข้อมูลเป็นหลัก โดยปกติถือว่าเป็นการแลกเปลี่ยนที่ยอมรับได้การพิจารณาชื่อโฮสต์จะถูกเปิดเผยในการสืบค้น DNS อย่างไรก็ตาม
ถ้าคุณขอเว็บไซต์ด้วยที่อยู่ IP เท่านั้น
เซิร์ฟเวอร์ทำอะไรเมื่อไม่ทราบว่าโฮสต์ที่คุณขอขึ้นอยู่กับการติดตั้งและปรับใช้เซิร์ฟเวอร์ โดยทั่วไปจะมีการระบุไซต์ "เริ่มต้น", "catchall" หรือ "fallback" ที่จะให้การตอบสนองต่อคำขอทั้งหมดที่ไม่ได้ระบุโฮสต์อย่างชัดเจน
ไซต์เริ่มต้นนี้อาจเป็นไซต์อิสระของตนเอง (มักแสดงข้อความแสดงข้อผิดพลาด) หรืออาจเป็นไซต์อื่น ๆ บนเซิร์ฟเวอร์ทั้งนี้ขึ้นอยู่กับการตั้งค่าของผู้ดูแลระบบเซิร์ฟเวอร์
Host:
ส่วนหัว ในกรณีของโฮสติ้งที่ใช้ร่วมกันเว็บเซิร์ฟเวอร์สามารถกำหนดค่าโดยผู้ให้บริการเพื่อจัดการสิ่งนี้ในรูปแบบที่แตกต่างกัน (เช่นมีค่าเริ่มต้นเปลี่ยนเส้นทางไปยังผู้ให้บริการ ฯลฯ )