5月阅读周·HTTP权威指南:Web主机托管之HTTP/1.1的Host首部篇
引言
HTTP(Hypertext Transfer Protocol,超文本传输协议)是在万维网上进行通信时所使用的协议方案。HTTP有很多应用,但最著名的是用于Web浏览器和Web服务器之间的双工通信。
《HTTP权威指南》一书将HTTP中一些互相关联且常被误解的规则梳理清楚,并编写了一系列基于各种主题的章节介绍HTTP各方面的特性。纵观全书,对HTTP“为什么”这样做进行了详细的解释,而不仅仅停留在它是“怎么做”的。此外,这本书还介绍了很多HTTP应用程序正常工作所必需且重要的非HTTP技术。
这本书主要包括以下内容:
- 第一部分描述了Web的基础构件与HTTP的核心技术
- 第二部分重点介绍了Web系统的结构构造块:HTTP服务器、代理、缓存、网关以及机器人应用程序。
- 第三部分提供了一套用于追踪身份、增强安全性以及控制内容访问的技术和技巧。
- 第四部分涵盖HTTP报文主体和Web标准,前者包含实际内容,后者描述并处理主体内容。
- 第五部分介绍了发布和传播Web内容的技巧。
- 第六部分是一些很有用的参考附录,以及相关技术的教程。
Web主机托管
当你把资源放在公共的Web服务器上时,因特网社区就可以使用它们了。这些资源可以是简单的文本文件或图像,也可以是复杂的实时导航地图或电子商务购物网关。能够将这些由不同组织拥有的种类繁多的资源便利地发布到网站上,并将其放置在能以合理价格提供很好性能的Web服务器上,是很关键的。
对内容资源的存储、协调以及管理的职责统称为Web主机托管。主机托管是Web服务器的主要功能之一。保存并提供内容,记录对内容的访问以及管理内容都离不开服务器。如果不想自行管理服务器所需的软硬件,就需要主机托管服务,即托管者。托管者出租服务和网站管理维护业务,并提供各种不同程度的安全级别、报告及易用性。托管者通常把很多网站放在一些强大的Web服务器上联合运行,这样可以获得更高的成本效益、可靠性和性能。
HTTP/1.1的Host首部
语法与用法
Host首部描述了所请求的资源所在的因特网主机和端口号,和原始的URL中得到的一样:
Host = "Host" ":" host [ ":" port ]
但要注意以下问题。
- 如果Host首部不包含端口,就使用地址方案中默认的端口。
- 如果URL中包含IP地址,Host首部就应当包含同样的地址。
- 如果URL中包含主机名,Host首部就必须包含同样的名字。
- 如果URL中包含主机名,Host首部就不应当包含URL中这个主机名对应的IP地址,因为这样会扰乱虚拟主机托管服务器的工作,它在同一个IP地址上堆叠了很多虚拟站点。
- 如果URL中包含主机名,Host首部就不应当包含这个主机名的其他别名,因为这样也会扰乱虚拟主机托管服务器的工作。
- 如果客户端显式地使用代理服务器,客户端就必须把 原始服务器,而不是代理服务器的名字和端口放在Host首部中。以往,若干个Web客户端在启用客户端代理设置时,错误地把发出的Host首部设置成代理的主机名。这种错误行为会使代理和原始服务器都无法正常处理请求。
- Web客户端必须在所有请求报文中包含Host首部。
- Web代理必须在转发请求报文之前,添加Host首部。
- HTTP/1.1的Web服务器必须用400状态码来响应所有缺少Host首部字段的HTTP/1.1请求报文。
下面是一段简单的HTTP请求报文,用于获取www.joes-hardware.com的主页,其中带有必需的Host首部字段:
GET http://www.joes-hardware.com/index.html HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.51 [en] (X11; U; IRIX 6.2 IP22)
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/
png, */*
Accept-Encoding: gzip
Accept-Language: en
Host: www.joes-hardware.com
缺失Host首部
有少量在用的老式浏览器不会发送Host首部。如果某个虚拟主机托管服务器使用Host首部来判断所服务的是哪个网站,而报文中没有出现Host首部的话,那它可能会把用户导向某个默认的Web页面(例如网络服务提供商的Web页面),也可能返回一个错误页面建议用户升级浏览器。
解释Host首部
对于没有进行虚拟主机托管,而且不允许资源随请求主机的不同而变化的原始服务器来说,可以忽略Host首部字段的值。但资源会随主机名的不同而变化的原始服务器,都必须在一条HTTP/1.1请求判断其所请求的资源时使用下列规则。
(1)如果HTTP请求报文中的URL是绝对的(也就是说,包含方案和主机部分),就忽略Host首部的值。
(2)如果HTTP请求报文中的URL没有主机部分,而该请求带有Host首部,则主机/端口的值就从Host首部中取。
(3)如果通过第(1)步或第(2)步都无法获得有效的主机,就向客户端返回400Bad Request响应。
Host首部与代理
某些版本的浏览器发送的Host首部不正确,尤其是配置使用代理的时候。例如,配置使用代理时,一些老版本的Apple和PointCast客户端会错误地把代理的名字,而不是原始服务器的名字放在Host首部里发送。
总结
Host首部是HTTP/1.1的请求首部,定义在RFC 2068中。由于虚拟服务器的流行,绝大多数HTTP客户端(即使是不遵循HTTP/1.1的客户端),都实现了Host首部。
作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。
- 点赞
- 收藏
- 关注作者
评论(0)