什么是HTTP;主持人;头球?

什么是HTTP;主持人;头球?,http,http-headers,Http,Http Headers,假设在发送HTTP请求时TCP连接已经建立,IP地址和端口是隐式已知的——TCP连接是IP+端口 那么,为什么我们需要Host头呢?这仅适用于有多个主机映射到TCP连接中隐含的IP地址的情况吗?标头告诉Web服务器要使用哪个虚拟主机(如果已设置)。您甚至可以使用多个别名(=域和通配符域)拥有相同的虚拟主机。在这种情况下,如果您希望基于不同的域提供不同的行为,您仍然可以在web应用程序中手动读取该标题。这是可能的,因为在您的Web服务器中,您可以(如果我没有弄错的话,您必须)设置一个vhost作为

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

那么,为什么我们需要
Host
头呢?这仅适用于有多个主机映射到TCP连接中隐含的IP地址的情况吗?

标头告诉Web服务器要使用哪个虚拟主机(如果已设置)。您甚至可以使用多个别名(=域和通配符域)拥有相同的虚拟主机。在这种情况下,如果您希望基于不同的域提供不同的行为,您仍然可以在web应用程序中手动读取该标题。这是可能的,因为在您的Web服务器中,您可以(如果我没有弄错的话,您必须)设置一个vhost作为默认主机。只要
主机
头与任何配置的虚拟主机不匹配,就会使用此默认vhost

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


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

这一点已被克服;然而,这再次破坏了一些隐私,因为服务器名称现在再次以纯文本形式传输,所以中间的每个人都会看到您试图连接的主机名

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

另一个有趣的事实是:大多数Web服务器(如果不是全部的话)会拒绝您的HTTP请求,如果它不包含一个
主机
头,即使它可能会被忽略,因为只有默认的vhost配置。这意味着http-(get-)请求中所需的最低信息是包含
方法
资源
协议版本
的第一行,至少是
主机
头,如下所示:

GET /someresource.html HTTP/1.1
Host: www.example.com
他们实际上是这样说的:

GET /someresource.html HTTP/1.1
Host: www.example.com
必须在所有HTTP/1.1请求消息中发送主机头字段。A. 400(错误请求)状态代码将发送到任何HTTP/1.1请求 缺少主机头字段或包含多个主机头字段的消息


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

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

请求中的“主机”标头字段提供主机和端口
来自目标URI的信息,使源服务器能够 为多个请求提供服务时区分资源
单个IP地址上的主机名