要回答有关为什么缓存仍然起作用的问题,即使Web服务器未包含标头也是如此:
- 过期:
[a date]
- 快取控制: max-age =
[seconds]
服务器恳请任何中间代理不缓存内容(即,该项目仅应缓存在专用缓存中,即仅在您自己的本地计算机上):
但是服务器忘记了包含任何类型的缓存提示:
- 他们忘记了包含Expires,因此浏览器知道在该日期之前都使用缓存的副本
- 他们忘记了包含Max-Age,因此浏览器知道缓存的内容适合多长时间
- 他们忘记了包含E-Tag,因此浏览器可以执行条件请求
但它们的确在响应中包含了“ 最后修改日期”:
Last-Modified: Tue, 16 Oct 2012 03:13:38 GMT
因为浏览器知道文件的修改日期,所以它可以执行条件请求。它将向服务器询问文件,但指示服务器仅发送自2012/10/16 3:13:38以来已被修改的文件:
GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT
服务器收到请求,意识到客户端已经具有最新版本。而不是发送client 200 OK
,然后发送页面内容,而是告诉您缓存的版本是好的:
304 Not Modified
您的浏览器确实必须忍受向服务器发送请求并等待响应的延迟,但是确实节省了重新下载静态内容的麻烦。
为什么选择Max-Age?为什么到期?
因为最后修改很烂。
并非服务器上的所有内容都有与其关联的日期。如果我正在动态建立网页,则没有日期相关联- 现在是。但我非常愿意让用户将首页缓存15秒:
200 OK
Cache-Control: max-age=15
如果用户不满意F5,他们将继续获取缓存版本15秒钟。如果是公司代理,则在同一15秒窗口中点击同一页面的所有67198用户将全部获得相同的内容-所有内容均来自关闭缓存。绩效赢得所有人。
添加的好处Cache-Control: max-age
是浏览器甚至不必执行条件请求。
- 如果仅指定
Last-Modified
,则浏览器必须执行请求If-Modified-Since
,并注意304 Not Modified
响应
- 如果您指定
max-age
,则浏览器甚至不必经历网络往返;内容将直接从缓存中取出
“缓存控制:最大使用期限”和“过期”之间的区别
Expires
与现代(c。1998)Cache-Control: max-age
标头的旧版等效:
1998年以后编写的任何网站都不应再使用Expires
,而应使用max-age
。
什么是ETag?
ETag与Last-Modified相似,不同之处在于ETag不必是日期-只需是某物即可。
如果我要从数据库中提取产品列表,则服务器可以将最后一个rowversion
作为ETag 发送,而不是发送日期:
200 OK
ETag: "247986"
我的ETag可以是静态资源(例如图像,js,css,字体)的SHA1哈希值,也可以是缓存的呈现页面的SHA1哈希值(即Mozilla MDN Wiki的工作;它们哈希最终标记):
200 OK
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
就像在基于Last-Modified的条件请求的情况下一样:
GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT
304 Not Modified
我可以基于ETag 执行条件请求:
GET / HTTP/1.1
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
304 Not Modified
An ETag
之所以优越,Last-Modified
是因为它适用于文件以外的内容或具有日期概念的内容。它只是为