Следующая цитата из HTTP The Definite Guide предполагает, что «URL» откуда-то исходит, и использует его для ограничения заголовка Host. Откуда "URL"? Это из первой строки HTTP-запроса (например, после GET
), из ввода веб-клиента (например, из аргумента curl
], или из ввода в адресной строке веб-браузера)? Спасибо.
Заголовок Host указывает хост в Интернете и номер порта для запрашиваемый ресурс, полученный из исходный URL :
Host = "Host" ":" host [":" port]
В частности:
• Если заголовок хоста не содержит порт, порт по умолчанию для предполагается схема.
• Если URL содержит IP-адрес, заголовок Host должен содержать тот же адрес.
• Если URL содержит имя хоста, заголовок хоста должен содержать то же имя.
• Если URL содержит имя хоста, заголовок хоста не должен содержать IP-адрес, эквивалентный имени хоста URL, потому что это будет сломать виртуально размещенные серверы, которые накладывают несколько виртуальных сайтов по одному IP-адресу.
• Если URL содержит имя хоста, заголовок хоста не должен содержать другой псевдоним для этого имени хоста, потому что это также нарушит виртуально размещенные серверы.
Поле хоста было введено в стандарте HTTPv1.0 и было необязательным.
В HTTPv1.1 необходимо использовать поле Host.
До этого стандарта, в примере HTTPv0.9, браузер просто выдавал одну удаленную команду, например:
GET example.com/index.html[cr][lf][cr][lf]
[cr] [lf] - это возврат каретки, то есть двойной возврат каретки в строке.
Для лучшей поддержки SSL и по другим причинам в HTTPv1 добавлено поле Host.
В HTTPv1 + тот же запрос в браузере будет выглядеть так:
GET example.com/index.html[cr][lf]
Host: example.com[cr][lf]
[cr][lf][cr][lf]
или
GET index.html[cr][lf]
Host: example.com[cr][lf]
[cr][lf][cr][lf]
Чтобы запросить, например, что;
GET example.com/index.html[cr][lf]
Host: contoso.com[cr][lf]
[cr][lf][cr][lf]
Было бы логической ошибкой, и это против того, о чем вас предупреждают RFC.
Как видите, URL создается удаленным сервером, в зависимости от того, как был написан запрос.