鉴于在发送HTTP请求时已建立TCP连接,因此隐式知道IP地址和端口 - TCP连接是IP +端口。那么,为什么我们需要Host
标题?这是仅在多个主机映射到TCP连接中隐含的IP地址的情况下才需要的吗?
答案 0 :(得分:92)
host
标头告诉网络服务器使用哪个虚拟主机(如果已设置)。您甚至可以使用多个别名(=域和通配符域)来拥有相同的虚拟主机。在这种情况下,如果您想根据所解决的不同域提供不同的行为,您仍然可以在Web应用程序中手动读取该标题。这是可能的,因为在您的网络服务器中,您可以(如果我没有弄错,您必须)将一个 vhost设置为默认主机。只要host
标头与任何已配置的虚拟主机不匹配,就会使用此默认vhost。
这意味着:你做得对,虽然说&#34;多个主机&#34;可能有点误导:主机(被寻址的机器)是相同的,真正解析到IP地址的是不同的域名(包括子域),也被称为主机名< / em>(但不是主持人!)。
虽然不是问题的一部分,但有趣的是:此规范在早期导致SSL出现问题,因为Web服务器必须提供与客户端已解决的域相对应的证书。但是,为了知道要使用的证书,Web服务器应该事先知道所寻址的主机名。但是因为客户端仅通过加密通道发送该信息(这意味着:在证书已经发送之后),服务器必须假设您浏览了默认主机。这意味着每个IP地址/端口组合有一个受ssl保护的域。
Server Name Indication已经克服了这个问题。然而,这再次破坏了一些隐私,因为服务器名称现在再次以纯文本形式传输,因此每个中间人都会看到您尝试连接的主机名。
虽然Web服务器会知道服务器名称指示中的主机名,但host
标头不会过时,因为服务器名称指示信息仅在TLS握手中使用。使用不安全的连接时,根本没有服务器名称指示,因此host
标头仍然有效(并且是必需的)。
另一个有趣的事实:大多数网络服务器(如果不是全部)拒绝你的http请求,如果它不包含一个host
标头,即使它可以省略,因为只配置了默认的vhost。这意味着http-(get-)请求中的最低要求信息是包含METHOD
RESOURCE
和PROTOCOL VERSION
以及至少host
- 标头的第一行,如下所示:
GET /someresource.html HTTP/1.1
Host: www.example.com
您可能需要阅读MDN Documentation on the Host-Header以获取更多信息,其中包含
必须在所有HTTP / 1.1请求消息中发送主机头字段。一个 400(错误请求)状态代码将被发送到任何HTTP / 1.1请求 消息缺少主机头字段或包含多个。
如Darrel Miller所述,完整的规格可以在RFC7230中找到。
答案 1 :(得分:17)
在尝试理解HTTP标头的含义和目的时,我总是建议去权威来源。
&#34;主持人&#34;请求中的头字段提供主机和端口
来自目标URI的信息,使原始服务器成为
在为多个请求提供服务时区分资源 单个IP地址上的主机名。
答案 2 :(得分:0)
HTTP 1.1,主机头是IP信息和端口号之外的第三条信息,您可以使用该信息唯一地标识Web域或Microsoft称为应用程序服务器的信息。例如,URL www.example.com的主机头名称是www.example.com。 HTML 3.0或更高版本的浏览器支持HTTP 1.1。浏览器包括您在浏览器发送到服务器的请求标头的位置字段中指定的主机标头名称。如果未在请求标头中指定主机标头名称,则根Web域将充当默认Web服务器。