【问题标题】:Why does Wget have Host Header in its HTTP request?为什么 Wget 在其 HTTP 请求中有 Host Header?
【发布时间】:2026-01-23 18:35:01
【问题描述】:

HTTP/1.0 和 HTTP/1.1 的主要区别在于 HTTP/1.1 中有一个 ma​​ndatory Host 标头(来源:HTTP Pocket Reference - O'reilly )。

那么,为什么那个使用 HTTP/1.0 协议的 Wget 里面有一个主机头呢?

我的 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 请求中包含 Host Header,wget 使用 HTTP/1.0 协议而 HTTP/1.1 也可以代替它的原因是什么?

【问题讨论】:

    标签: http-headers wget http-1.1


    【解决方案1】:

    当人们意识到这是允许一台服务器为多个域提供页面的唯一方法时,Host 标头被添加为 HTTP/1.0 的“可选”附加项。 wget 使用带有 Host 的 HTTP/1.0 作为与最大数量的站点兼容的方式,其中一些站点即使需要 Host 也不会响应 HTTP/1.1。

    【讨论】:

    • 但是 Paul,服务器将尽一切努力遵守客户端使用的最兼容的 HTTP 版本。所以即使 wget 使用 1.1 服务器也会使用最兼容的一个。不管是1.1还是1.0,为什么不响应请求?
    • 如果服务器不理解 1.1,它不会响应 1.1 请求。我知道现在不使用 1.1 的服务器数量可能很少,但是由于 wget 不需要 1.1 可以提供的任何 1.0 不提供的东西,为什么它会选择删除任何 1.0 服务器?
    【解决方案2】:

    在 HTTP/1.0 中,Host 标头是可选的。不同之处在于 HTTP/1.1 将其从 optional 更改为 mandatory

    特别是,如果 GET 行不包含主机名(如您的示例中),则需要将其包含在标头中(因为否则,如果服务器无法确定“虚拟”域将不可能您的请求是针对哪个主机的)。

    【讨论】: