2017-04-01 137 views
15

假设发送HTTP请求时已经建立了TCP连接,IP地址和端口是隐式知道的 - TCP连接是IP +端口。那么,我们需要Host头文件?这仅仅是在多个主机映射到TCP连接中隐含的IP地址的情况下才需要的吗?什么是http主机头?

回答

27

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

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

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

这已经克服Server Name Indication,但是,再次打破了一些隐私,作为服务器名以纯文本格式,现在转移了,所以每个人在这方面的中间人会看到,该主机名你想连接。

虽然网络服务器可以知道服务器名称指示中的主机名,但host标头并未过时,因为服务器名称指示信息仅用于TLS握手中。使用不安全的连接时,根本没有服务器名称指示,所以host标题仍然有效(必要)。

另一个有趣的事实是:即使它可能被省略,因为只有默认的虚拟主机配置,即使它可以被省略,大多数网络服务器(如果甚至不是所有的)都拒绝你的http请求,如果它不包含一个host-header。这意味着,在所需的最小的信息的基于HTTP(GET-)请求是含有METHODRESOURCEPROTOCOL VERSION并且至少host -header,像这样的第一行:

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

您可能需要读取MDN Documentation on the Host-Header有关更多信息,请参阅

主机头字段必须在所有HTTP/1.1请求消息中发送。 A 400(错误请求)状态码将被发送到任何HTTP/1.1请求 消息,该消息缺少Host头字段或包含多个消息。

正如达雷尔米勒所说,完整的规格可以在RFC7230找到。

+2

优秀的信息 - 谢谢! – ineedhelp

1

我总是建议在尝试了解HTTP标头的含义和目的时转至权威来源。

在一个请求中的“主机”头域提供的主机和端口从目标URI
信息,使源服务器
资源之间区分,同时在单个服务于对多种
主机名的请求IP地址。

https://tools.ietf.org/html/rfc7230#section-5.4