为什么要缓存此响应?


32

我有一个客户端,其站点的index.html当前返回以下标头:

接受范围:字节
连接:保持活动
内容编码:gzip
内容长度:3658
内容类型:text / html
日期:2013年10月10日星期四,格林尼治标准时间
ETag:“ 4aa95e1-2ed2-4e721324728b7”
保持活动:超时= 5,最大= 100
上次修改时间:2013年9月24日,星期二,格林尼治标准时间
伺服器:Apache / 2.2.22
变化:接受编码,用户代理

我显然会建议他们增加ExpiresCache-Control适当的,但我很困惑:Chrome浏览器缓存它从缓存中(不发送一个请求这个资源,并使用在所有),甚至几个小时后(例如,它重用副本它于昨天上午8:30在下午1:30缓存)。我可以在Chrome控制台的“网络”标签中清楚地看到这一点,该页面显示了请求,并且200 (OK)在“ 状态”列和(from cache)大小”列中显示为灰色。(我尚未更改Chrome的缓存默认设置。)

我意识到,该规范允许用户代理在标题的方向上做出自己的决定。那是这里发生的事吗?Chrome浏览器看到它是在几天前进行了最后一次修改的,可以随意使用一天之久的版本吗?还是我想念的东西?

Answers:


33

当“到期”未指定“缓存控制”头,而是一个“的Last-Modified”头指定,浏览器都在他们应该保持多长时间的文件中缓存猜测。某些浏览器确实使用允许页面在缓存中保留一天或更长时间的算法。

Google缓存最佳做法指南指出:

Last-Modified是一个“弱”缓存头,因为浏览器会应用启发式方法来确定是否从缓存中获取项目。(试探法在不同的浏览器中是不同的。)


Mozilla(Firefox)有一个HTTP缓存常见问题解答,概述了针对这种情况的算法(尽管自文档发布于2002年以来,算法可能已更改):

...我们寻找“最后修改的”标题。如果存在此标头,则高速缓存的新鲜度生存期等于“ Date”标头的值减去“ Last-modified”标头的值除以10。

因此,在您的情况下,修改时间与现在的时间差为15天,那么Firefox会将资源缓存1.5天。

似乎所有主流浏览器都使用Firefox实施的相同10%规则。在StackOveflow上已经提出了一个问题,要求这些启发式方法。那里针对不同浏览器的不同答案表明它们都具有相似的实现。有针对Internet Explorer和Webkit(Chrome和Safari)的答案。


浏览器缓存的大小可能是缓存算法确定文件可以保存一天以上的文件的限制因素。浏览器通常具有用于缓存的磁盘空间量的设置。许多用户在关闭浏览器时也会清除其缓存。因此,缓存此类文件的时间通常取决于:

  • 浏览器已分配的缓存空间量
  • 用户访问的网站数(以及这些网站的大小)
  • 用户是否关闭了浏览器

您能否澄清一下,“然后Firefox会将资源缓存1.5天。” 从哪个日期开始,它将缓存到1.5天?如果已经15天了,那它已经过期了,不是吗?而且由于现在负号最后一次修改将永远增加,因此您将永远缓存它!
myDoggyWritesCode

1
不会永远。在上一次修改的标头和下载时间之间的1/10的时间内。如果您已经过了15天,那可能意味着该文件自上次修改以来已经过了150天。
Stephen Ostermiller
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.