3月阅读周·HTTP权威指南:缓存之设置缓存控制篇
引言
HTTP(Hypertext Transfer Protocol,超文本传输协议[插图])是在万维网上进行通信时所使用的协议方案。HTTP有很多应用,但最著名的是用于Web浏览器和Web服务器之间的双工通信。
《HTTP权威指南》一书将HTTP中一些互相关联且常被误解的规则梳理清楚,并编写了一系列基于各种主题的章节介绍HTTP各方面的特性。纵观全书,对HTTP“为什么”这样做进行了详细的解释,而不仅仅停留在它是“怎么做”的。此外,这本书还介绍了很多HTTP应用程序正常工作所必需且重要的非HTTP技术。
这本书主要包括以下内容:
- 第一部分描述了Web的基础构件与HTTP的核心技术
- 第二部分重点介绍了Web系统的结构构造块:HTTP服务器、代理、缓存、网关以及机器人应用程序。
- 第三部分提供了一套用于追踪身份、增强安全性以及控制内容访问的技术和技巧。
- 第四部分涵盖HTTP报文主体和Web标准,前者包含实际内容,后者描述并处理主体内容。
- 第五部分介绍了发布和传播Web内容的技巧。
- 第六部分是一些很有用的参考附录,以及相关技术的教程。
缓存
Web缓存是可以自动保存常见文档副本的HTTP设备。当Web请求抵达缓存时,如果本地有“已缓存的”副本,就可以从本地存储设备而不是原始服务器中提取这个文档。
设置缓存控制
控制Apache的HTTP首部
Apache Web服务器提供了几种设置HTTP缓存控制首部的机制。其中很多机制在默认情况下都没有启动——你要启动它们(有些情况下先要获取Apache的扩展模块)。下面是对某些Apache特性的简要描述。
- mod headers:通过mod headers模块可以对单独的首部进行设置。装载了这个模块,就可以用设置单个HTTP首部的指令来扩充Apache的配置文件了。还可以将这些设置与Apache的常用表达式以及过滤器结合在一起使用,将这些首部与个别内容关联起来。这里有一个配置实例,这个例子将某目录下所有的HTML文件都标识为非缓存的:
<Files *.html>
Header set Cache-control no-cache
</Files>
- mod expires:mod expires模块提供的程序逻辑可以自动生成带有正确过期日期的Expires首部。通过这个模块,就可以将文档的过期日期设置为对其最后一次被访问之后或者其最近修改日期之后的某一时间段。通过这个模块可以为不同的文件类型设置不同的过期日期,还可以使用便捷的详尽描述信息来描述其缓存能力,比如“access plus 1 month(自访问之后起1个月)”。这里有几个例子:
ExpiresDefault A3600
ExpiresDefault M86400
ExpiresDefault "access plus 1 week"
ExpiresByType text/html "modification plus 2 days 6 hours 12 minutes"
- mod cern meta:通过mod cern meta模块可以将一个包含HTTP首部的文件与特定的对象联系起来。启动这个模块时,就创建了一组“元文件”,每个需要控制的文档一个,而且还会为每个元文件添加所期望的首部。
通过HTTP-EQUIV控制HTML缓存
HTTP服务器响应首部用于回送文档的到期信息以及缓存控制信息。Web服务器与配置文件进行交互,为所提供的文档分配正确的Cache-Control首部。
为了让作者在无需与Web服务器的配置文件进行交互的情况下,能够更容易地为所提供的HTML文档分配HTTP首部信息,HTML 2.0定义了<META HTTP-EQUIV>标签。这个可选的标签位于HTML文档的顶部,定义了应该与文档有所关联的HTTP首部。这里有一个<META HTTP-EQUIV>标签设置的例子,它将HTML文档标记为非缓冲的:
<HTML>
<HEAD>
<TITLE>My Document</TITLE>
<META HTTP-EQUIV="Cache-control" CONTENT="no-cache">
</HEAD>
最初,HTTP-EQUIV标签是给Web服务器使用的。如HTML RFC 1866所述,Web服务器应该为HTML解析<META HTTP-EQUIV>标签,并将规定的首部插入HTTP响应中:
...
HTTP服务器可以用此信息来处理文档。特别是,它可以在为请求此文档的报文所发送的响应中包含一个首部字段:首部名称是从HTTP-EQUIV属性值中获取的,首部值是从CONTENT属性值中获取的。
不幸的是,支持这个可选特性会增加服务器的额外负载,这些值也只是静态的,而且它只支持HTML,不支持很多其他的文件类型,所以很少有Web服务器和代理支持此特性。
但是,有些浏览器确实会解析并在HTML内容中使用HTTP-EQUIV标签,像对待真的HTTP首部那样来处理嵌入式首部。这样的效果并不好,因为支持HTTP-EQUIV标签的HTML浏览器使用的Cache-control规则可能会与拦截代理缓存所用的规则有所不同。这样会使缓存的过期处理行为发生混乱。
总之,<META HTTP-EQUIV>标签并不是控制文档缓存特性的好方法。通过配置正确的服务器发出HTTP首部,是传送文档缓存控制请求的唯一可靠的方法。
总结
不同的Web服务器为HTTP Cache-Control和Expiration首部的设置提供了一些不同的机制。本节简要介绍了流行的Apache Web服务器是怎样支持缓存控制的。
作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。
- 点赞
- 收藏
- 关注作者
评论(0)