Назад | Перейти на главную страницу

Что такое «URL», ограничивающий заголовок Host?

Следующая цитата из 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-адрес создается удаленным сервером в зависимости от того, как был написан запрос.