http - 什么是 HTTP "Host" header ?

标签 http http-headers

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

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

最佳答案

Host header 告诉网络服务器要使用哪个虚拟主机(如果已设置)。您甚至可以使用多个别名(= 域和通配符域)来拥有相同的虚拟主机。在这种情况下,如果您想根据不同的域提供不同的行为,您仍然可以在 Web 应用程序中手动读取该 header 。这是可能的,因为在您的网络服务器中,您可以(如果我没记错的话,您必须)将 一个 虚拟主机设置为默认主机。只要 host header 与任何已配置的虚拟主机不匹配,就会使用此默认虚拟主机。

意思是:你没看错,虽然说“多个主机”可能有点误导:主机(被寻址的机器)是一样的,真​​正解析到 IP 地址的是不同的域名(包括子域),也称为 主机名(但不是主机!)。


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

Server Name Indication 解决了这个问题;然而,这再次破坏了一些隐私,因为服务器名称现在再次以纯文本传输,因此每个中间人都会看到您尝试连接的主机名

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

另一个有趣的事实:大多数网络服务器(如果不是全部)拒绝您的 HTTP 请求,如果它不完全包含一个 Host header ,即使它可以被省略,因为只配置了默认的虚拟主机。这意味着 http-(get-) 请求中所需的最少信息是包含 METHOD RESOURCEPROTOCOL VERSION 的第一行,并且至少Host header ,如下所示:

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

MDN Documentation on the "Host" header他们实际上是这样说的:

A Host header field must be sent in all HTTP/1.1 request messages. A 400 (Bad Request) status code will be sent to any HTTP/1.1 request message that lacks a Host header field or contains more than one.

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

关于http - 什么是 HTTP "Host" header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43156023/

相关文章:

node.js - 从 0.10.40 升级后 Node HTTP 删除请求不再有效

c - 如何在没有 libcurl 的情况下在 C 中发出 HTTP get 请求?

http-headers - 无法删除响应 header 中的服务器(Amazon AWS)

java - 如何通过socket发送HTTPS请求?

http - 为静态 Assets 设置无 cookie 域

php - 检测用户是否在代理后面

angular - 内部函数 如何使用 "this.http (Restful)"?

node.js - 如何区分同一IP上的两个Web客户端

internet-explorer - X-下载-选项 : noopen equivalent

apache - 根据 apache http 服务器中的请求 header 验证传入请求