53

Chrome 在 Glassfish 服务器上缓存资源时遇到问题。尽管存在 Last-Modified 标头,但不会发送 expires 和 no-cache 标头,并且资源(大约 4 MB SWF 文件)正在被 Chrome 缓存。

有时 Chrome 会得到 304 代码,而其他时候它只是简单地执行 200(来自缓存)。我了解 304 - Chrome 可能会检查最近的 Last-Modified 日期和缓存版本来决定。但其他时候它会执行 200(来自缓存),它不返回任何标题信息,并且似乎 Chrome 只是假设文件没有被修改而不是检查。

谷歌自己的网站声明如下:

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

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

4

2 回答 2

20

浏览器认为缓存响应新鲜的时间通常与上次修改的时间相关:

由于原始服务器并不总是提供明确的过期时间,缓存可以在未指定明确时间时分配启发式过期时间,采用使用其他头字段值(例如 Last-Modified 时间)的算法......如果响应具有 Last-Modified 头字段([RFC7232] 的第 2.2 节),鼓励缓存使用启发式过期值,该值不超过自该时间以来间隔的一部分。该分数的典型设置可能是 10%。[https://www.rfc-editor.org/rfc/rfc7234#section-4.2.2]

有关 Chrome(和其他浏览器)如何计算该值的详细信息,可以在源代码(Chrome v49 中的示例)中找到。看起来 Chrome 也会计算相对于 Last-Modified 标头的值。

归功于这篇文章

于 2016-08-26T07:27:28.447 回答
13

DEFAULT_CACHE_TIME = 300

我通过在http://code.google.com/p/chromium/source/search?q=DEFAULT_CACHE_TIME&origq=DEFAULT_CACHE_TIME&btnG=Search+Trunk搜索“DEFAULT_CACHE_TIME” 找到了上述内容。

有一个名为“chromeextensionsdocs.py”的文件,其中包含 DEFAULT_CACHE_TIME。

相信这是基于http://code.google.com/appengine/docs/python/memcache/overview.html
中给出的示例的秒数 在“chromeextensionsdocs.py”中,DEFAULT_CACHE_TIME 作为最后一个参数发送memcache.add

我不完全确定这是否是正确的值,但似乎很可能是在将各个部分放在一起时。

于 2012-03-16T16:48:48.043 回答