Это часть протокола HTTP 1.1.
В частности, протокол HTTP 1.1 включает в себя заголовок, называемый «host:», который указывает, к какому веб-сайту на конкретном сервере клиент пытается получить доступ.
Таким образом, если snoopy.net и woodstock.org совместно используют 192.0.32.10 и ваш браузер пытается получить контент из http://snoopy.net/doghouse
конкретного http-запроса, он будет выглядеть так:
GET /doghouse HTTP/1.1
Host: snoopy.net
Если желаемым URL является http://woodstock.org/seeds
запрос будет выглядеть
GET /seeds HTTP/1.1
Host: woodstock.org
В обоих случаях между вашим компьютером и портом 80 сервера будет TCP-сокет. Сервер будет знать, как получить содержимое из /var/www/snoopy.net или /var/www/woodstock.org/ на основе заголовка Host.
Были бы другие заголовки для файлов cookie и другие вещи, такие как тип браузера и разрешенный контент, но именно заголовок «Host» - это то, что позволяет веб-серверу знать, какой виртуальный веб-сайт желателен.
Там больше в RFC2616 .
Именно поэтому сайты https * должны *** иметь собственный IP-адрес - обмен ключами ssl и проверка сертификата выполняются до транзакции http, поэтому сервер http не будет знать, выдать ли сертификат для «woodstock». org "или" snoopy.net ", когда он получает соединение https через порт 443 из 192.0.32.10.
редактировать
** в комментариях Grawity указывает, что в спецификации TLS есть расширения для SSL, которые позволяют серверу знать, к какому веб-сайту пытается обратиться пользователь, и что большинство современных веб-браузеров имеют эти расширения, так что, должно быть, слишком сильный.