鉴于在发送HTTP请求时TCP连接已经建立,因此IP地址和端口是隐含已知的——TCP连接是一个IP + 端口。
那么,我们为什么需要Host
头部呢?这只有在将多个主机映射到TCP连接所隐含的IP地址的情况下才需要吗?
鉴于在发送HTTP请求时TCP连接已经建立,因此IP地址和端口是隐含已知的——TCP连接是一个IP + 端口。
那么,我们为什么需要Host
头部呢?这只有在将多个主机映射到TCP连接所隐含的IP地址的情况下才需要吗?
Host
头告诉Web服务器使用哪个虚拟主机(如果已设置)。您甚至可以使用多个别名(=域名和通配符域名)来设置相同的虚拟主机。在这种情况下,如果您希望根据不同的域名提供不同的行为,您仍然可以在您的Web应用程序中手动读取该头部。这是可能的,因为在您的Web服务器中,您可以(而且如果我没有记错的话,您必须)设置一个虚拟主机作为默认主机。当host
头部与任何配置的虚拟主机都不匹配时,将使用此默认虚拟主机。Host
头部并不过时,因为服务器名称指示信息仅在TLS握手中使用。在未加密的连接中,根本没有服务器名称指示,所以Host
头部仍然有效(且必要)。Host
头部,即使它可以被省略,因为只有默认虚拟主机被配置。这意味着在一个HTTP(GET)请求中,最少需要的信息是包含METHOD
、RESOURCE
和PROTOCOL VERSION
的第一行,以及至少一个Host
头部,就像这样:GET /someresource.html HTTP/1.1
Host: www.example.com
如Darrel Miller所提到的,完整的规范可以在RFC7230中找到。在所有的HTTP/1.1请求消息中,必须发送一个Host头部字段。对于任何缺少Host头部字段或包含多个Host头部字段的HTTP/1.1请求消息,将发送400(错误请求)状态码。
在理解HTTP头部字段的含义和目的时,我总是建议去权威的来源查找。
请求中的“Host”头部字段提供了来自目标URI的主机和端口信息,使得源服务器能够在服务于单个IP地址上的多个主机名的请求时区分资源。