HTTP 1.1 GET方法中强制要求包含“Host”子句的原因

11
上周我在我的《计算机网络》课上引起了一场轩然大波,争论的焦点是关于在 HTTP 1.1 GET 消息头中需要强制使用 Host 子句的必要性。
不管是从网站上看到的还是同学们对我喊出的原因,总是一样的:支持虚拟主机所需。然而,我会尽力清晰地表达,这似乎没有意义。
我理解为了允许两个域名在同一台机器上运行(因此共享相同的 IP 地址),必须有一种区分两个域名的方法。
但我不明白的是,为什么不可能在没有 Host 子句的情况下(HTTP 1.0 样式),通过使用绝对 URL(例如 GET http://www.example.org/index.html)而不是相对 URL(例如 GET /index.html)来实现这一点。 当 HTTP 消息到达服务器时,服务器将通过查看请求行中消息的 URL 中的主机名(而不是查看 Host 子句)来将消息重定向到适当的主机。
如果你们这些高手能帮我理解我到底缺少什么,我将非常感激。

2
在GET请求中发出类似完整的绝对URL就是代理服务器的工作方式。现在代理服务器无法知道它是否应该代理该请求,还是它是某个本地资源的格式不正确的请求。 - Marc B
1
那不是重点,Marc。当时他们并没有为了那个原因而计划这样做。 - Steven Martin
3个回答

9

这个内容在这个讨论串中被讨论:

关于HTTP/2.0的建议和相关理由。

  1. 为客户端请求添加一个头部,指示客户端正在访问的URL的主机名和端口。

理由:商业服务器维护者最常请求的功能之一是能够在单个端口上运行单个服务器,并根据URL中的主机名响应不同的顶级页面。

因为客户端无法提前知道服务器是否支持一个或多个站点,因此建议使用绝对请求URI(Uniform Resource Identifier),详情请参考此处

Re the first proposal, to incorporate the hostname somewhere. This would be cleanest put into the URL itself :-

GET http://hostname/fred http/2.0

This is the syntax for proxy redirects.

以下是此论点的内容:链接

由于将有一些支持主机名报告,而一些不支持的客户端混合使用,因此这个信息如何传递到服务器并不重要。既然无关紧要,那么更容易实现的解决方案就是一个新的HTTP请求头字段。它允许所有客户端和服务器像现在一样运行,而不需要进行任何代码更改。实际上需要主机名信息的客户端和服务器可以进行微小的修改以发送包含URL的额外标头字段并处理它。

[...]

我所建议的只是有一种更好的方式来实现将主机名信息传递到服务器,而不涉及请求语法的黑客攻击,并且可以向后兼容所有客户端和服务器。

请自由阅读以了解最终决定。但请注意,很容易在其中迷失。


3
为HTTP请求添加指定主机支持的原因是IP地址有限(这在HTTP 1.0发布时还不是问题)。如果您的问题是“为什么要在Host头中指定主机而不是在请求行中指定”,答案是需要在HTTP/1.0和1.1之间进行互操作。如果问题是“为什么Host头是强制性的”,这与加快过渡到已分配IP地址的愿望有关。以下是关于Internet address conservation与HTTP/1.1相关背景信息。

0
'Host' 头的原因是明确此请求所指的主机。如果没有 'Host',服务器必须事先知道它应该将 'http://joesdogs.com/' 路由到 Joe's Dogs,而将 'http://joscats.com/' 路由到 Jo's Cats,即使它们在同一个 Web 服务器上。(如果服务器有两个名称,比如 'joscats.com' 和 'joescats.com',它们应该引用相同的网站怎么办?)
有了明确的 'Host' 头,这些决策可以更轻松地编程实现。

4
我认为问题是:"为什么HTTP 1.1没有要求使用绝对URI,而是添加了主机头(Host Header)"。 - CodeCaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接