什么是HTTP“主机”;头吗?

假设TCP连接在发送HTTP请求时已经建立,IP地址和端口是隐式已知的——TCP连接是IP +端口。

那么,为什么我们需要Host头文件呢?是否只有在有多个主机映射到TCP连接中隐含的IP地址的情况下才需要这样做?

235125 次浏览

Host报头告诉web服务器使用哪个虚拟主机(如果设置好了)。你甚至可以使用多个别名 (= domains和通配符-domains)来拥有同一个虚拟主机。在这种情况下,如果你想基于不同的域名地址提供不同的行为,你仍然可以在你的web应用中手动读取头信息。这是可能的,因为在你的web服务器中,你可以(如果我没有弄错的话,你必须)设置一个 vhost为默认主机。当host报头与任何配置的虚拟主机不匹配时,将使用这个默认vhost。

这意味着:你做对了,尽管说“多个主机”;可能会有些误导:主机(寻址的机器)是相同的,真正被解析到IP地址的是不同的域名(包括子域),也被称为主机名(但不是主机!)
< br >


虽然这不是问题的一部分,但一个有趣的事实是:这个规范在早期导致了SSL的问题,因为web服务器必须交付与客户端已寻址的域对应的证书。但是,为了知道要使用什么证书,web服务器应该事先知道地址主机名。但是,由于客户端仅通过加密通道发送该信息(这意味着:在证书已经发送之后),服务器必须假定您浏览了默认主机。这意味着每个IP地址/端口组合有一个ssl安全域。

这个问题已经通过服务器名称;然而,这再次破坏了一些隐私,因为服务器名现在再次以纯文本传输,因此每个中间人都会看到你试图连接的的主机名

虽然web服务器可以从服务器名指示中知道主机名,但Host报头并没有过时,因为服务器名指示信息只在TLS握手中使用。对于不安全的连接,根本没有服务器名称指示,因此Host报头仍然有效(并且是必要的)。

另一个有趣的事实:大多数web服务器(如果不是全部)拒绝你的HTTP请求,如果它不包含恰好一个Host头,即使它可以被省略,因为只有默认的vhost配置。这意味着http-(get-)请求中最少需要的信息是包含METHODRESOURCEPROTOCOL VERSION的第一行,以及至少Host标头,如下所示:

GET /someresource.html HTTP/1.1
Host: www.example.com

关于“主机”的MDN文档头中,它们实际上是这样表达的:

在所有HTTP/1.1请求消息中必须发送一个Host报头字段。一个 400(坏请求)状态码将被发送到任何HTTP/1.1请求

. message缺少Host报头字段或包含一个以上的消息

正如Darrel Miller提到的,完整的规格可以在RFC7230中找到。

当试图理解HTTP报头的含义和目的时,我总是建议去权威来源。

< p >“Host"请求头字段提供主机和端口
来自目标URI的信息,使原始服务器
在为多个
的请求提供服务时,区分不同的资源

.

.

https://www.rfc-editor.org/rfc/rfc7230#section-5.4