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

Accept-Ranges:    bytes
Connection:       Keep-Alive
Content-Encoding: gzip
Content-Length:   3658
Content-Type:     text/html
Date:             Thu, 10 Oct 2013 07:36:27 GMT
ETag:             "4aa95e1-2ed2-4e721324728b7"
Keep-Alive:       timeout=5, max=100
Last-Modified:    Tue, 24 Sep 2013 13:34:30 GMT
Server:           Apache/2.2.22
Vary:             Accept-Encoding,User-Agent


我显然建议他们酌情添加ExpiresCache-Control,但是我很困惑:Chrome会缓存该资源,并从缓存中使用它(根本不发送请求),即使几个小时后(例如,它又重新使用了昨天上午8:30 pm昨天缓存的副本) )。我可以在Chrome控制台的“网络”标签中清楚地看到这一点,该页面显示请求,并且在“状态”列中显示为200 (OK),在“大小”列中显示为(from cache)。 (我尚未更改Chrome的缓存默认设置。)

我意识到,该规范允许用户代理在不涉及标题的情况下做出自己的决定。那是这里发生的事吗? Chrome浏览器发现它是几天前进行的最后一次修改,可以随意使用一天之内过期的版本吗?还是我想念的东西?

#1 楼

如果未指定“ Expires”和“ Cache-Control”标头,但指定了“ Last-Modified”标头,则浏览器必须猜测应该将文档保留在缓存中多长时间。某些浏览器确实使用允许页面在缓存中保留一天或更长时间的算法。

Google缓存最佳做法指南指出: “弱”缓存头是因为浏览器会应用启发式方法来确定是否从缓存中获取项目。 (启发式方法在不同的浏览器中是不同的。)



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


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


如果修改后的时间与现在的时间相差15天,则Firefox会将资源缓存1.5天。

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


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


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


评论


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

– master_dodo
17年6月19日在10:03

不会永远。在上次修改的标头和下载时间之间的1/10的时间内。如果您已经过了15天,那可能意味着该文件自上次修改以来已经过了150天。

–斯蒂芬·奥斯特米勒(Stephen Ostermiller)
17年6月19日在10:16