Về cơ bản: trình duyệt bao gồm tên miền trong yêu cầu HTTP, vì vậy máy chủ web biết tên miền nào được yêu cầu và có thể phản hồi tương ứng.
Yêu cầu HTTP
Đây là cách yêu cầu HTTP điển hình của bạn xảy ra:
Người dùng cung cấp một URL, trong mẫu http://host:port/path
.
Trình duyệt trích xuất phần máy chủ (tên miền) của URL và dịch nó thành địa chỉ IP nếu cần, trong một quy trình được gọi là phân giải tên . Bản dịch này có thể xảy ra thông qua DNS, nhưng nó không phải (ví dụ: hosts
tệp cục bộ trên các hệ điều hành phổ biến bỏ qua DNS).
Trình duyệt mở kết nối TCP tới cổng được chỉ định hoặc mặc định là cổng 80, trên địa chỉ IP đó.
Trình duyệt gửi yêu cầu HTTP. Đối với HTTP / 1.1, nó trông như thế này:
GET /path HTTP/1.1
Host: example.com
( Host
Tiêu đề là tiêu chuẩn và bắt buộc trong HTTP / 1.1. Nó không được chỉ định trong thông số HTTP / 1.0, nhưng dù sao một số máy chủ cũng hỗ trợ nó.)
Từ đây, máy chủ web có một số thông tin có thể sử dụng để quyết định phản hồi sẽ là gì. Lưu ý rằng có thể một máy chủ web bị ràng buộc với nhiều địa chỉ IP.
- Địa chỉ IP được yêu cầu, từ ổ cắm TCP
- Địa chỉ IP của máy khách cũng có sẵn, nhưng điều này hiếm khi được sử dụng - đôi khi để chặn / lọc
- Cổng được yêu cầu, từ ổ cắm TCP
- Tên máy chủ được yêu cầu, như được chỉ định trong
Host
tiêu đề của trình duyệt trong yêu cầu HTTP.
- Đường dẫn được yêu cầu
- Bất kỳ tiêu đề nào khác (cookie, v.v.)
Như bạn có vẻ đã nhận thấy, thiết lập lưu trữ chia sẻ phổ biến nhất hiện nay đặt nhiều trang web trên một địa chỉ IP duy nhất: kết hợp cổng, chỉ Host
để phân biệt giữa các trang web.
Đây được gọi là Máy chủ ảo dựa trên tên trong vùng đất Apache, trong khi Nginx gọi chúng là Tên máy chủ trong Khối máy chủ và IIS thích Máy chủ ảo .
HTTPS thì sao?
HTTPS là một chút khác nhau. Mọi thứ đều giống hệt với việc thiết lập kết nối TCP, nhưng sau đó, một đường hầm TLS được mã hóa phải được thiết lập. Mục tiêu là không rò rỉ bất kỳ thông tin nào về yêu cầu.
Để xác minh rằng máy chủ thực sự sở hữu tên miền này, máy chủ phải gửi chứng chỉ được ký bởi bên thứ ba đáng tin cậy. Trình duyệt sau đó sẽ so sánh chứng chỉ này với tên miền mà nó yêu cầu.
Điều này trình bày một vấn đề. Làm thế nào để máy chủ biết chứng chỉ của máy chủ (trang web) nào sẽ gửi, nếu nó cần thực hiện việc này trước khi nhận được yêu cầu HTTP?
Theo truyền thống, điều này đã được giải quyết bằng cách có một địa chỉ IP (hoặc cổng) dành riêng cho mọi trang web yêu cầu HTTPS. Rõ ràng, điều này trở nên có vấn đề khi chúng ta bắt đầu dùng hết địa chỉ IPv4.
Nhập SNI (Chỉ định tên máy chủ). Trình duyệt hiện vượt qua tên máy chủ trong các cuộc đàm phán TLS, vì vậy máy chủ có thông tin này đủ sớm để gửi chứng chỉ chính xác. Về phía máy chủ, cấu hình rất giống với cách cấu hình máy chủ ảo HTTP.
Nhược điểm là tên máy chủ hiện được chuyển dưới dạng văn bản thuần túy trước khi mã hóa và về cơ bản là thông tin bị rò rỉ. Đây thường được coi là một sự đánh đổi chấp nhận được, vì dù sao tên máy chủ thường được hiển thị trong truy vấn DNS.
Điều gì nếu bạn yêu cầu một trang web chỉ bằng địa chỉ IP?
Máy chủ làm gì khi không biết máy chủ cụ thể nào bạn yêu cầu phụ thuộc vào cấu hình và cài đặt máy chủ. Thông thường, có một trang web "mặc định", "bắt" hoặc "dự phòng" được chỉ định sẽ cung cấp phản hồi cho tất cả các yêu cầu không chỉ định rõ ràng máy chủ lưu trữ.
Trang web mặc định này có thể là trang web độc lập của riêng nó (thường hiển thị thông báo lỗi) hoặc có thể là bất kỳ trang web nào khác trên máy chủ, tùy thuộc vào sở thích của quản trị viên máy chủ.
Host:
tiêu đề. Trong trường hợp lưu trữ được chia sẻ, máy chủ web có thể được nhà cung cấp định cấu hình để xử lý việc này theo các cách khác nhau (ví dụ: có mặc định, chuyển hướng đến nhà cung cấp, v.v.).