如果没有设置过期和/或无缓存头,谷歌浏览器会缓存资源多长时间?

65
我们在Glassfish服务器上遇到了Chrome缓存资源的问题。尽管存在Last-Modified头,但expires和no-cache头未被发送,导致Chrome缓存了该资源(一个约4 MB的SWF文件)。
有时Chrome会得到304代码,而其他时候它只是从缓存中返回200。我理解304 - Chrome可能正在检查最新的Last-Modified日期以决定是否使用缓存版本。但是其他时候它会返回200(来自缓存),这不会返回任何头信息,并且似乎Chrome仅仅假设文件没有被修改而没有进行检查。 Google自己的网站陈述如下:

HTTP/S支持浏览器对静态资源进行本地缓存。一些最新的浏览器(例如IE 7、Chrome)使用一种启发式方法来决定缓存所有没有显式缓存头的资源的时间。

但这并不能提供一个确定的答案。这个启发式算法是否有任何出版物?我意识到可能没有固定的答案(比如30天),但一些一般性的指导方针会很有用。此外,如果设置了Last-Modified,我不明白为什么Chrome不首先检查它。

2
它已经发布,因为Chrome的源代码是自由可用的。 - cdeszaq
嗨 - 你有没有找到更多关于这个启发式算法是如何确定的信息?如果逻辑确实基于DEFAULT_CACHE_TIME,那么是否有Chrome URI显示此设置? - andrew
2个回答

26
浏览器认为缓存响应仍然新鲜的时间通常与上次修改时间有关: 由于源服务器并不总是提供明确的过期时间,当未指定明确时间时,缓存可能会分配一种启发式的过期时间,采用使用其他头字段值(例如上次修改时间)的算法...如果响应具有Last-Modified头字段(RFC7232第2.2节),则建议缓存使用启发式过期值,该值不超过自那时以来的时间间隔的某个分数。这个分数的典型设置可能是10%。[https://www.rfc-editor.org/rfc/rfc7234#section-4.2.2] Chrome(和其他浏览器)计算该值的详细信息可以在源代码中找到( Chrome v49 的示例)。看起来Chrome也根据上次修改标头计算该值。 ( 感谢此帖子

1
如果没有Last-Modified头怎么办? - Phil
这将取决于浏览器。我从Chrome中提取的代码示例会回退到“max_age_value”和“Expires”标头,我想...... - Jon

13

DEFAULT_CACHE_TIME = 300

我通过搜索http://code.google.com/p/chromium/source/search?q=DEFAULT_CACHE_TIME&origq=DEFAULT_CACHE_TIME&btnG=Search+Trunk找到了上述内容。在名为"chromeextensionsdocs.py"的文件中包含了DEFAULT_CACHE_TIME。

根据http://code.google.com/appengine/docs/python/memcache/overview.html的示例,我认为这是以秒为单位的时间值。在"chromeextensionsdocs.py"中,DEFAULT_CACHE_TIME作为memcache.add的最后一个参数被传递。

虽然我不确定这是否是正确的值,但是在将所有信息整合在一起时,似乎很有可能是这个值。


1
除了在网上阅读一些文章外,我对这个主题没有任何特殊的知识。DEFAULT_CACHE_TIME可能是内存缓存的默认值,但据称Chrome有几个缓存之一是基于磁盘的。我想一个文件在内存缓存中会在5分钟后过期,但它在磁盘缓存中可能会更长时间。这篇文章提供了关于IE9如何确定无缓存策略文件何时过期的见解。 - ta.speot.is
9
“300”的单位是天?小时?还是秒? - Raptor
1
我相信这是基于秒的,根据上下文来看。 - Zack Macomber
14
我曾看到一些缺少缓存头信息的资源在 Chrome 磁盘缓存中被缓存了数周。 - Phil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接