为什么 chrome 不请求更新版本的缓存文件?

Why does chrome not request more recent version of cached file?

我有缓存问题。 Chrome 并不总是加载较新版本的站点资产,最常见的是 Javascript 由 Require.js 加载的文件。现在我遇到这个问题超过 24 小时了一个特定的文件。

如果我在打开 devtools(网络选项卡)的情况下加载页面,有问题的文件通常会显示 HTTP 200 响应,但在 "Size" 列中它会显示“(来自缓存)”。在 Headers 详细信息中显示 "Provisional headers are shown"。 Wireshark 显示确实没有从服务器请求该文件。

Chrome 将文件的 Last-Modified 日期显示为 2014 年 12 月 6 日星期六 01:27:55 GMT,但我对服务器的以下原始请求清楚地表明文件已更改更多最近

如果我自己执行原始请求,我在服务器返回的 headers 中看不到任何应该导致此问题的内容:

GET /js/path/to/file.js HTTP/1.1
Host: static.mydomain.com
User-Agent: Matt

HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Vary: Accept-Encoding
Content-Type: application/javascript
Accept-Ranges: bytes
ETag: "4203477418"
Last-Modified: Fri, 16 Jan 2015 18:28:30 GMT
Content-Length: 5704
Date: Fri, 16 Jan 2015 21:05:06 GMT
Server: lighttpd/1.4.33

.... data here ...

该问题已由 chrome 用户在多个操作系统上使用不同版本的 chrome 报告,但我通常不会收到有关其他浏览器缓存问题的报告。 (现在我在 "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36")

编辑: 这个问题似乎对 Require.js 加载的文件最令人反感,尽管我在页面中直接引用 javascript 时也遇到过这个问题。

我在这里错过了什么?为什么 chrome 不检查文件的新版本?

事实证明,当服务器响应中未指定 Cache-Control header 时,浏览器在缓存方面的行为记录很少(好吧,至少在未指定缓存行为时)。一般来说,在这种情况下,浏览器似乎根据文件的最后修改日期(如果在响应中声明)、当前日期和 ?????

来确定缓存项目的时间。

参见:https://webmasters.stackexchange.com/questions/53942/why-is-this-response-being-cached

遗憾的是,Google 关于 HTTP 缓存的官方页面没有提到如果未设置 header 会发生什么:https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching

编辑: 我 运行 浏览了一些有关所用启发式方法的更具体信息,此处:What heuristics do browsers use to cache resources not explicitly set to be cachable?