
文章插图
注意,max-age是对应于请求的时间的,所以在缓存生成时开始计算 。单位为持续的秒数,由于不用考虑时区等因素,这种方法更加简单准确 。
max-age指令可以支持的最多一年的持久时间,可以满足绝大多数情况的需求 。
使用Etag和If-None-Match更新缓存HTTP/1.1还引入一种新的Etag缓存更新策略,用来补充If-Modified-Since 。我们将实体标记视为服务器唯一标识Etag,响应标头中使用带有字母数字ID的资源版本表示方法:

文章插图
客户端下次请求时候,会使用"If-None-Match"头通知服务器端目前缓存的资源版本的ID特定版本的资源:

文章插图
如果资源的最新版本与上面的实体标签 ID"5c2209c2-14d05"不匹配,则服务器会响应新版本的ID 。否则响应"304 Not Modified" 。

文章插图
为了防止ID名重名,一般会使用散列(比如MD5)来表示正Etag的ID,通过对资源进行计算散列可以保证文件变更和验证,也能防止资源被篡改 。
通过私有和公共方式确保缓存隐私上面我们讨论了,基于浏览器的本地HTTP缓存,他在第一次请求时候在本地缓存资源 。现实中,我们请求的资源在被下载到本地之前通过一个或多个缓存或"共享"缓存(CDN) 。这些缓存或者代理由ISP供应商或者或服务商IT部门提供 。在HTTP访问中,各级中间缓存都会缓存并且浏览这些资源 。
为了解决这个问题,HTTP/1.1引入了私有缓存和公共缓存控制指令 。尽管这些指令还不十分完善,但是,我们可以使用它来设置,某些资源不会被在公共代理中被缓存 。
如果多个人共享电脑,他们则可以共享一个缓存 。如果资源指定了私有缓存指令,那么浏览器只会让请求他用户可以使用它 。
使用no-store和no-cache限制缓存HTTP/1.1纠正了HTTP/1.0的Pragma头的不足,并为Web开发人员提供了一种可以完全禁用缓存的方法 。第一个指令no-cache强制缓存在重用之前重新验证 。与must-revalidate不同,no-cache强制浏览器在必须重新验证 。
第二个指令,no-store 表示资源在任何情况下都不会被缓存 。
限制特定请求的缓存如果我们想要申请至少在一定时间内刷新的资源,该怎么办?也没有问题!缓存控制不仅仅可以通过服务器控制客户端的缓存,相应地客户端也可以用来指示对某些缓存的限制 。
max-age,no-cache和no-store指令都支持在客户端请求头中使用 。但是注意具体的意义可能是相反的 。例如,在请求中指定max-age标头会通知代理服务器它们不能使用任何早于该标头指定的持续时间的缓存响应 。
除上面的三个指令外,我们还可以使用四个仅在请求头中使用的缓存控制指令 。
第一个是min-fres: 它允许客户请求在设定时间秒数内会更新的资源 。

文章插图
max-stale指令通知缓存服务器,客户端愿意接受过期的资源,且过期不超过设定秒数的缓存 。

文章插图
no-transform指令通知缓存服务器客户端不希望请求任何版已经被修改该过的资源的缓存 。
最后一个指令only-if-cached通知缓存服务器客户端只需要一个缓存的响应,且不需要直接请求服务器获得缓存状态 。如果缓存无法满足请求,则应返回504网关超时响应 。
Vary头和服务器协商的响应我们最后要说明的浏览器如何识别缓存资源,以及服务器协商怎么进行 。
浏览器缓存实际上只查看URL和方法,由于几乎所有可缓存的请求都是GET请求,所以浏览器通过URL就能识别资源 。客户端服务器用于协商的HTTP头标识,服务器通过Vary标头传送给客户端 。例如,客户端发出以下请求:

文章插图
Accept-Encoding头表示在服务器端支持的情况下允Web服务器采用gzip对响应的资源进行压缩传输 。服务器需要响应协商请求头时候会使用Vary标识头,它会将其附加到其响应头的Vary标头中,如下图所示:

文章插图
推荐阅读
- Web应用程序测试的工具selenium用法详解
- Nginx/Lighttpd/Apache三大web服务器对比分析
- 本地Docker Jenkins构建dotcore web应用到Linux服务器 Docker上
- 编写自己的漏扫—Web漏洞扫描技巧篇
- 浅谈Web前端开发技术
- Web前端开发,必须要了解的四种跨域解决方案
- 如何挑选水蜜桃
- 如何挑选白油
- 管理Linux不想用命令行?可以试试Webmin!最新CentOS8上体验一下
- 快速用 Haskell 构建超级简单的 Web 技术栈
