3月阅读周·HTTP权威指南:Web服务器之构建、发送响应篇
引言
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服务器会做些什么
Perl服务器是一个Web服务器的小例子。最先进的商用Web服务器要比它复杂得多,但它们确实执行了几项同样的任务:
(1) 建立连接——接受一个客户端连接,或者如果不希望与这个客户端建立连接,就将其关闭。
(2)接收请求——从网络中读取一条HTTP请求报文。
(3)处理请求——对请求报文进行解释,并采取行动。
(4)访问资源——访问报文中指定的资源。
(5)构建响应——创建带有正确首部的HTTP响应报文。
(6)发送响应——将响应回送给客户端。
(7)记录事务处理过程——将与已完成事务有关的内容记录在一个日志文件中。
构建响应
响应实体
如果事务处理产生了响应主体,就将内容放在响应报文中回送过去。如果有响应主体的话,响应报文中通常包括:
- 描述了响应主体MIME类型的Content-Type首部;
- 描述了响应主体长度的Content-Length首部;
- 实际报文的主体内容。
MIME类型
Web服务器要负责确定响应主体的MIME类型。有很多配置服务器的方法可以将MIME类型与资源关联起来。
- MIME类型(mime.types):Web服务器可以用文件的扩展名来说明MIME类型。Web服务器会为每个资源扫描一个包含了所有扩展名的MIME类型的文件,以确定其MIME类型。这种基于扩展名的类型相关是最常见的。
- 魔法分类(Magic typing):Apache Web服务器可以扫描每个资源的内容,并将其与一个已知模式表(被称为魔法文件)进行匹配,以决定每个文件的MIME类型。这样做可能比较慢,但很方便,尤其是文件没有标准扩展名的时候。
- 显式分类(Explicit typing):可以对Web服务器进行配置,使其不考虑文件的扩展名或内容,强制特定文件或目录内容拥有某个MIME类型。
- 类型协商:有些Web服务器经过配置,可以以多种文档格式来存储资源。在这种情况下,可以配置Web服务器,使其可以通过与用户的协商来决定使用哪种格式(及相关的MIME类型)“最好”。还可以通过配置Web服务器,将特定的文件与MIME类型相关联。
重定向
Web服务器有时会返回重定向响应而不是成功的报文。Web服务器可以将浏览器重定向到其他地方来执行请求。重定向响应由返回码3XX说明。Location响应首部包含了内容的新地址或优选地址的URI。重定向可用于下列情况。
- 永久搬离的资源:资源可能已经被移动到了新的位置,或者被重新命名,有了一个新的URL。Web服务器可以告诉客户端资源已经被重命名了,这样客户端就可以在从新地址获取资源之前,更新书签之类的信息了。状态码301 Moved Permanently就用于此类重定向。
- 临时搬离的资源:如果资源被临时移走或重命名了,服务器可能希望将客户端重定向到新的位置上去。但由于重命名是临时的,所以服务器希望客户端将来还可以回头去使用老的URL,不要对书签进行更新。状态码303 See Other以及状态码307Temporary Redirect就用于此类重定向。
- URL增强:服务器通常用重定向来重写URL,往往用于嵌入上下文。当请求到达时,服务器会生成一个新的包含了嵌入式状态信息的URL,并将用户重定向到这个新的URL上去。[插图]客户端会跟随这个重定向信息,重新发起请求,但这次的请求会包含完整的、经过状态增强的URL。这是在事务间维护状态的一种有效方式。状态码303 See Other和307 Temporary Redirect用于此类重定向。
- 负载均衡:如果一个超载的服务器收到一条请求,服务器可以将客户端重定向到一个负载不太重的服务器上去。状态码303 See Other和307 Temporary Redirect可用于此类重定向。
- 服务器关联Web服务器上可能会有某些用户的本地信息;服务器可以将客户端重定向到包含了那个客户端信息的服务器上去。状态码303 See Other和307Temporary Redirect可用于此类重定向。
- 规范目录名称客户端请求的URI是一个不带尾部斜线的目录名时,大多数Web服务器都会将客户端重定向到一个加了斜线的URI上,这样相对链接就可以正常工作了。
发送响应
Web服务器通过连接发送数据时也会面临与接收数据一样的问题。服务器可能有很多条到各个客户端的连接,有些是空闲的,有些在向服务器发送数据,还有一些在向客户端回送响应数据。
服务器要记录连接的状态,还要特别注意对持久连接的处理。对非持久连接而言,服务器应该在发送了整条报文之后,关闭自己这一端的连接。
对持久连接来说,连接可能仍保持打开状态,在这种情况下,服务器要特别小心,要正确地计算Content-Length首部,不然客户端就无法知道响应什么时候结束了。
记录日志
最后,当事务结束时,Web服务器会在日志文件中添加一个条目,来描述已执行的事务。大多数Web服务器都提供了几种日志配置格式。
总结
一旦Web服务器识别出了资源,就执行请求方法中描述的动作,并返回响应报文。响应报文中包含有响应状态码、响应首部,如果生成了响应主体的话,还包括响应主体。
作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。
- 点赞
- 收藏
- 关注作者
评论(0)