HTTP 1.1 определяет заголовок, называемый заголовком "Host".
Прежде чем Apache или любой другой сервер увидит запрос, браузер клиента создает заголовки запроса http 1.1 и отправляет запрос на сервер, с которым запрашивает ваш браузер соединение.
Как только запрос достигает значения apache, сервер просматривает часть заголовка Host заголовков HTTP-запроса. Вы можете наблюдать это, используя wireshark, liveHttpHeaders, HTTPfox или любой другой инструмент для анализа / захвата пакетов http. Заголовок узла в HTTP 1.1 (заголовок Host: не определен для HTTP 1.0 или 0.9) отформатирован следующим образом:
Хост: www.example.com \ r \ n
Когда apache просматривает этот заголовок, он анализирует его и просматривает существующую таблицу VirtualHosts, которая используется для сопоставления соответствующих заголовков хоста с определенными каталогами или действиями.
То есть, если у вас есть NameVirtualHost для www.example.com, который указывает на /some/path/example.com/
NameVirtualhost stuff here
<VirtualHost 127.0.0.1:80>
ServerName www.example.com
DocumentRoot /some/path/example.com
....
</VirtualHost>
ваш апач примет следующий запрос:
GET /index.html HTTP/1.1\r\n <-- version is a key part
Connection: close\r\n
Host: www.example.com\r\n <-- key part
Accept: blah\r\n
Another: blah\r\n
Прочтите вики-страницу, чтобы узнать больше о формате заголовка.
Apache увидит, что заголовок узла содержит www.example.com, и подаст файл
/some/path/example.com/index.html, поскольку этот каталог и имя файла соответствуют запрошенному ресурсу, и именно этот каталог следует использовать для обслуживания запросов с заголовком узла, содержащим www.example.com.
Вот как это работает.