什么是http主机头?


120

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

Answers:


140

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

这意味着:没错,尽管说“多个主机”可能有点误导性:主机(被寻址的机器)是相同的,真正解析为IP地址的是不同的域名(包括子域),这些域名也被引用用作主机名(而不是主机!)。

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

服务器名称指示已解决了这一问题;但是,这再次破坏了一些隐私,因为服务器名称现在又以纯文本格式传输,因此每个中间人都可以看到您要连接的主机名

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

另一个有趣的事实:如果没有完全包含一个host标头,则大多数Web服务器(如果不是全部)都会拒绝您的http请求,即使可以将其省略,因为仅配置了默认的虚拟主机。这意味着http-(get-)请求中的最低要求信息是包含METHOD RESOURCEPROTOCOL VERSION且至少包含host-header 的第一行,如下所示:

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

Host-HeaderMDN文档中,它们实际上是这样表达的:

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

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


好答案。您写道:“这是可能的,因为在您的Web服务器中,您可以(如果我没有记错,您必须)将一个虚拟主机设置为默认主机。只要主机头与任何已配置的虚拟主机都不匹配,就会使用该默认虚拟主机。主持人。” 我想签入RFC7230,但没有发现vhost仅3个接近的出现,virtual host其含义与您的短语不相符,而12个default主要涉及端口,
Alexei Martianov,

关于主机的唯一说明是:“否则,如果主机标头字段提供有非空字段值,则授权组件与主机字段值相同。” -恕我直言不一样。您能指出我在RFC上的观点吗?
阿列克谢·马蒂安诺夫

实用方面:对于某些服务器,我发送标头为host =域名的POST并获得200(确定),我发送更改的主机标头并获得404(未找到)。这是否意味着服务器by the book配置不正确(完全)?
阿列克谢·马蒂安诺夫

由于评论无法编辑:第二个引号是default通过搜索找到的词附近,Otherwise, the authority component is assigned the default name configured for the server
Alexei Martianov,

奇怪。virtual host我在tools.ietf.org/html/rfc7230中的搜索发现的所有3个事件都在中Appendix A. HTTP Version History。看起来您的搜索找到了其他内容。
阿列克谢·马蒂安诺夫

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.