Когда вы впервые начинаете изучать, как доменные имена, IP-адреса, веб-серверы и веб-сайты сочетаются и работают вместе, это может быть немного запутанным или ошеломляющим. Как все это работает так гладко? В сегодняшнем посте SuperUser Q&A есть ответы на вопросы любопытного читателя.
Сегодняшняя сессия вопросов и ответов проходит благодаря SuperUser - подразделению Stack Exchange, группы веб-сайтов вопросов и ответов, управляемой сообществом.
Фото любезно предоставлено Розмари Фогтли (Flickr) .
Вопрос
Читатель SuperUser user3407319 хочет знать, каждый ли веб-сервер содержит только один веб-сайт:
Исходя из того, что я понимаю о DNS и связывании доменного имени с IP-адресом веб-сервера, на котором хранится веб-сайт, означает ли это, что каждый веб-сервер может содержать только один веб-сайт? Если веб-серверы содержат более одного веб-сайта, то как все это решить, чтобы я мог получить доступ к нужному веб-сайту без каких-либо проблем или путаницы?
На каждом ли веб-сервере размещается только один веб-сайт или их больше?
Ответ
У участника SuperUser Боба есть для нас ответ:
Обычно браузер включает имя домена в HTTP-запрос, чтобы веб-сервер знал, какой домен был запрошен, и мог соответствующим образом ответить.
HTTP-запросы
Вот как происходит ваш типичный HTTP-запрос:
1. Пользователь предоставляет URL-адрес в виде http: // хост: порт / путь.
2. Браузер извлекает часть URL-адреса хоста (домена) и переводит ее в IP-адрес (при необходимости) в процессе, известном как разрешение имени. Это преобразование может происходить через DNS, но не обязательно (например, файл локальных хостов в обычных операционных системах обходит DNS).
3. Браузер открывает TCP-соединение с указанным портом или по умолчанию использует порт 80 на этом IP-адресе.
4. Браузер отправляет HTTP-запрос. Для HTTP / 1.1 это выглядит так:
![]()
Заголовок хоста является стандартным и требуется в HTTP / 1.1. Он не был указан в спецификации HTTP / 1.0, но некоторые серверы все равно его поддерживают.
Отсюда у веб-сервера есть несколько частей информации, которые он может использовать, чтобы решить, каким должен быть ответ. Обратите внимание, что один веб-сервер может быть привязан к нескольким IP-адресам.
- Запрошенный IP-адрес из TCP-сокета (IP-адрес клиента также доступен, но он используется редко, а иногда и для блокировки / фильтрации)
- Запрошенный порт из TCP-сокета
- Запрошенное имя хоста, как указано в заголовке хоста браузером в HTTP-запросе.
- Запрошенный путь
- Любые другие заголовки (файлы cookie и т. Д.)
Как вы, кажется, заметили, наиболее распространенная в наши дни установка общего хостинга помещает несколько веб-сайтов на одну комбинацию IP-адрес: порт, оставляя только хост, чтобы различать веб-сайты.
Это известно как Виртуальный хост на основе имени в Apache-land, а Nginx называет их Имена серверов в серверных блоках , а IIS предпочитает Виртуальный сервер .
А как насчет HTTPS?
HTTPS немного отличается. Все идентично до установления TCP-соединения, но после этого должен быть установлен зашифрованный туннель TLS. Цель - не допустить утечки информации о запросе.
Чтобы убедиться, что веб-сервер действительно владеет этим доменом, веб-сервер должен отправить сертификат, подписанный доверенной третьей стороной. Затем браузер сравнит этот сертификат с запрошенным доменом.
Это представляет проблему. Как веб-сервер узнает, какой сертификат хоста / веб-сайта отправить, если ему нужно сделать это до получения HTTP-запроса?
Традиционно эта проблема решалась выделением выделенного IP-адреса (или порта) для каждого веб-сайта, требующего HTTPS. Очевидно, это стало проблемой, поскольку у нас заканчиваются адреса IPv4.
Войти SNI (Указание имени сервера). Теперь браузер передает имя хоста во время согласования TLS, поэтому веб-сервер получает эту информацию достаточно рано, чтобы отправить правильный сертификат. На стороне веб-сервера конфигурация очень похожа на настройку виртуальных хостов HTTP.
Обратной стороной является то, что имя хоста теперь передается в виде обычного текста перед шифрованием и по сути является утечкой информации. Обычно это считается приемлемым компромиссом, хотя, учитывая, что имя хоста в любом случае обычно отображается в запросе DNS.
Что делать, если вы запрашиваете веб-сайт только по IP-адресу?
Что делает веб-сервер, когда он не знает, какой конкретный хост вы запрашиваете, зависит от реализации и конфигурации веб-сервера. Как правило, указывается веб-сайт «по умолчанию», «универсальный» или «резервный», который будет предоставлять ответы на все запросы, в которых явно не указан хост.
Этот веб-сайт по умолчанию может быть отдельным независимым веб-сайтом (часто показывающим сообщение об ошибке) или любым другим веб-сайтом на веб-сервере, в зависимости от предпочтений администратора веб-сервера.
Есть что добавить к объяснению? Отключить звук в комментариях. Хотите узнать больше ответов от других технически подкованных пользователей Stack Exchange? Ознакомьтесь с полной веткой обсуждения здесь .