Следующая цитата из HTTP Полное руководство предполагает, что «URL» откуда-то исходит, и использует его для ограничения заголовка Host. Откуда «URL»? Это из первой строки HTTP-запроса (например, после GET
) или из ввода в веб-клиент (например, аргумент для curl
, или ввод в адресной строке веб-браузера)? Спасибо.
Заголовок Host указывает хост в Интернете и номер порта для запрашиваемого ресурса, полученный из исходный URL:
Host = "Host" ":" host [ ":" port ]
В частности:
• Если заголовок Host не содержит порта, предполагается порт по умолчанию для схемы.
• Если URL содержит IP-адрес, заголовок Host должен содержать тот же адрес.
• Если URL содержит имя хоста, заголовок Host должен содержать то же имя.
• Если URL содержит имя хоста, заголовок Host не должен содержать IP-адрес, эквивалентный имени хоста URL, потому что это приведет к поломке виртуально размещенных серверов, которые накладывают несколько виртуальных сайтов на один IP-адрес.
• Если URL содержит имя хоста, заголовок Host не должен содержать другого псевдонима для этого имени хоста, потому что это также нарушит работу виртуально размещенных серверов.
Поле хоста было введено в стандарте 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-адрес создается удаленным сервером в зависимости от того, как был написан запрос.