Нет перенаправлений DNS
Первое важное исправление терминологии:
В DNS нет «перенаправлений».В вашем случае DNS просто используется для сопоставления имени с IP.Иногда из-за CNAME имя сопоставляется с другим именем, которое затем сопоставляется с IP-адресом.Неважно, если есть промежуточные шаги, подобные этому, в конце имя сопоставляется с IP (или возникает ошибка разрешения DNS)
Это также означает, что если URL имеет определенный порт, то этоне изменяется, итоговый IP будет запрашиваться через порт, указанный в URL.
Перенаправления - это функция уровня HTTP: при запросе веб-сервера для https://www.mygreatsite.example/foo
он ответит с кодом возврата HTTP 301,302, 303, 307 или 308 и давая вам (HTTP-клиент, он же браузер) новый URL-адрес для перехода.
виртуальный хостинг HTTP
В старые добрые времена IP-адреса былимного.Если вы размещали www.site1.example
и www.site2.example
в одном и том же физическом блоке, вы можете прикрепить к каждому один другой IP-адрес.Следовательно, в этом конкретном случае, в некотором смысле, заголовок HTTP host
бесполезен, сам факт подключения либо к 192.0.2.37
, либо к 192.0.2.42
уже позволяет узнать, какой сайт вам нужен.На самом деле в HTTP/0.9
не было заголовка host
, поскольку заголовков вообще не было.
Но затем, когда в игру вступил массовый виртуальный хостинг, а адреса IPv4 стали недостаточными, вы больше не могли присоединятьодин IP-адрес для каждого сайта, так как это тоже трата.Таким образом, через DNS либо прямо, либо косвенно (CNAME
записей) оба сайта разрешаются на один и тот же IP-адрес.
Следовательно, когда HTTP-клиент подключается к серверу, сервер по умолчанию не имеет возможностизнать, какой сайт вы хотите.Вот почему заголовок HTTP host
, заполненный клиентом, позволяет серверу узнать, к какому веб-сайту вы хотите получить доступ, независимо от своего IP-адреса, который был разрешен ранее через DNS.
По умолчанию HTTP использует порт 80, поэтому он часто не виден в URL.Конечно, если вы заставили своих клиентов использовать http://www.site1.example:4569
с одной стороны и http://www.anothersite2.com:9873
с другой стороны, то вы правы, заголовок host
на самом деле не понадобится.За исключением того, что план рушится по многим причинам:
- Номера портов также не являются бесконечным пространством, и многие из них уже используются обычно для других целей;поэтому даже если вы в какой-то момент расширите эту схему, вы не сможете присоединить новые веб-сайты к тому же IP
- , но более важно, чем в предыдущем техническом пункте, для людей это будет кошмар, и многие люди будут использовать забыть портномер, а затем не заходя на соответствующий веб-сайт.
Следовательно, обычно это делается не так, если вы хотите предоставить какую-то определенную службу через HTTP, но в порте не по умолчанию вы обычно устанавливаете обратный проксиперед ней.Или вы делаете перенаправление HTTP с http://www.coolpublicname.example/
на http://www.complicatedinternalname.example:9713
, но затем клиент видит эту голую правду.
Виртуальный хостинг HTTPS
Попутно отметим, что HTTPS добавил уровень сложности, потому чтовеб-серверу HTTPS необходимо отправить свой сертификат клиенту, но, поскольку каждый веб-сайт может иметь свой сертификат, ему необходимо знать, какой веб-сайт хочет использовать клиент, который он может узнать через HTTP-заголовок host
, но затем следует после TLS.Рукопожатие закончено, поэтому на ранней стадии отправки сервером сертификата это еще не доступно.
Так что в самые ранние времена HTTPS мы были вынуждены снова делать виртуальный хостинг на основе IP, а не на основе именивиртуальный хостинг, как это было возможно в чистом HTTP благодаря заголовку host
.
Решение было найдено с расширением TLS, указанием имени сервера (SNI), которое клиент отправляет на сервер заранее и дает имя веб-сайта, чтобы сервер мог отправить соответствующий сертификат, и, следовательно, мы вернулись в бизнесе в случае, основанном на именах, где теоретически вы можете иметь бесконечное число имен, разрешающихся на один и тот же IP-адрес, чтобы их обслуживал один данный веб-сервер.