Почему Wget имеет заголовок узла в своем HTTP-запросе?

Основное различие между HTTP/1.0 и HTTP/1.1 заключается в том, что в HTTP/1.1 есть обязательный заголовок Host (источник: HTTP Pocket Reference — O'reilly).

Итак, почему этот Wget, использующий протокол HTTP/1.0, имеет заголовок хоста?

Мой вывод Wget с netcat:

GET / HTTP/1.0
User-Agent: Wget/1.12 (linux-gnu)
Accept: */*
Host: 127.0.0.1:10101
Connection: Keep-Alive

Поскольку ясно, что Wget использует версию протокола HTTP/1.0, как он может иметь заголовок хоста? Или я ошибаюсь в своем понимании протокола HTTP?

И даже если HTTP/1.0 может иметь заголовок узла в своем HTTP-запросе, что может быть причиной того, что wget использует протокол HTTP/1.0, в то время как HTTP/1.1 также может использоваться вместо этого?


person Shiv Deepak    schedule 27.10.2010    source источник


Ответы (2)


Заголовок Host был добавлен как «необязательное» дополнение к HTTP/1.0 очень рано, когда стало понятно, что это единственный способ позволить одному серверу обслуживать страницы для нескольких доменов. wget использует HTTP/1.0 с хостом как способ обеспечения совместимости с максимальным количеством сайтов, некоторые из которых не отвечают на HTTP/1.1, даже если им требуется хост.

person Paul Tomblin    schedule 27.10.2010
comment
но Пол, сервер сделает все возможное, чтобы соответствовать наиболее совместимой версии HTTP, которую использует клиент. поэтому, даже если wget использует сервер 1.1, он будет использовать наиболее совместимый. либо 1.1, либо 1.0, почему не отвечает на запрос? - person Shiv Deepak; 27.10.2010
comment
Если сервер не понимает 1.1, он не ответит на запрос 1.1. Я знаю, что количество серверов, не поддерживающих 1.1, в наши дни, вероятно, ничтожно мало, но поскольку wget не требует ничего из того, что 1.1 может предоставить, чего нет в 1.0, почему он решил вырезать какие-либо серверы 1.0? - person Paul Tomblin; 27.10.2010

В HTTP/1.0 заголовок Host был необязательным. Разница в том, что HTTP/1.1 изменил его с необязательный на обязательный.

В частности, если строка GET не включает имя хоста (как в вашем примере), вам необходимо включить его в заголовки (потому что в противном случае «виртуальные» домены были бы невозможны, если сервер не может определить, на каком хосте был ваш запрос). за).

person Dean Harding    schedule 27.10.2010