HTTP 1.1 GET中强制“Host”子句的原因

时间:2014-03-12 18:40:53

标签: http networking web network-protocols

上周,我在计算机网络课程中开始大惊小怪,因为 HTTP 1.1 GET 消息标题中需要强制Host子句。

我提供的原因,无论是在网上写的还是我的同学都对我大喊大叫,总是一样的:需要支持虚拟主机。但是,我会尽量清楚,这似乎没有意义。

据我所知,为了允许在一台计算机上托管两个域(因此,共享相同的 IP 地址),必须存在区分两个域名的方法。

我不明白为什么不能通过使用绝对值来实现没有 Host子句( HTTP 1.0 样式) 网址(例如GET http://www.example.org/index.html)而不是相对的(例如GET /index.html)。 当 HTTP 消息到达服务器时,它(服务器)会将消息重定向到适当的主机,而不是通过查看Host子句,而是通过查看主机名在消息的请求行中的 URL 中。

如果你们中的任何一个铁杆黑客能够帮助我理解我在这里错过了什么,我将非常感激。

3 个答案:

答案 0 :(得分:6)

this thread中讨论了这个问题:

  

适用于HTTP / 2.0的适度建议及其基本原理。

     
      
  1. 向客户端请求添加标头,指示主机名和   客户端访问的URL的端口。
  2.         

    理由:商业服务器最受欢迎的功能之一   维护者是在单个端口上运行单个服务器的能力   并根据具体情况对不同的顶级页面做出回应   URL中的主机名。

需要绝对请求URI(因为客户端无法事先知道服务器是否包含一个或多个站点)是suggested

  

重新提出第一个提议,将主机名合并到某处。这个   将最简洁的内容放入URL本身: -

GET http://hostname/fred http/2.0
     

这是代理重定向的语法。

提出了this个参数:

  

由于会有多个客户端,一些支持主机名报告   有些不是,这个信息如何到达服务器并不重要。   由于无关紧要,因此更容易实现的解决方案是新的HTTP   请求标题字段。它允许所有客户端和服务器按原样运行   没有代码更改现在做。实际需要主机的客户端和服务器   名称信息可以有微小的mod发送额外的头字段   包含URL并处理它。

     

[...]

     

我所建议的是,有更好的方法   实现主机名信息的传递到不涉及的服务器   破解请求语法,可以向后兼容所有客户端   和服务器。

随意阅读以自行发现最终决定。但要注意,很容易迷失在那里。

答案 1 :(得分:0)

“主机”标头的原因是明确该请求引用的主机。如果没有“主机”,服务器必须提前知道应该将“http://joesdogs.com/”路由到Joe's Dogs,而它应该将“http://joscats.com/”路由到Jo's Cats,即使它们在同一个网络服务器(如果服务器有两个名称,比如'joscats.com'和'joescats.com'应该引用同一个网站,该怎么办?)

拥有明确的“主机”标题可以使这些决策更容易编程。

答案 2 :(得分:0)

在HTTP请求中添加支持以指定主机的原因是有限的IP地址供应(当HTTP 1.0问世时,这还不是问题)。

如果您的问题是“为什么在主机标头中指定主机而不是在请求线”,则答案是需要HTTP / 1.0和1.1之间的互操作性。

如果问题是“为什么主机标头是强制性的”,这与加速转移远离分配的IP地址的愿望有关。

以下是Internet address conservation关于HTTP / 1.1的一些背景信息。