2015-01-16 59 views
2

我有一个缓存问题。 Chrome浏览器并不总是加载较新版本的网站资产,大多数情况下是由Require.js加载的JavaScript文件。现在我已经有一个特定的文件超过24小时这个问题。为什么chrome不请求更新版本的缓存文件?

如果我打开devtools(网络标签)打开的页面,违规文件通常显示HTTP 200响应,但在“大小”列中显示“(来自缓存)”。在标题详细信息中显示“临时标题显示”。 Wireshark显示文件确实没有从服务器请求。

Chrome显示文件的最后修改日期为星期六,2014年12月6日01:27:55 GMT,但我对服务器的下面的原始请求清楚地表明该文件最近发生了更改。

如果我做了原始的请求我自己,我没有看到服务器返回的头什么,应该引起这个问题:

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,例如Gecko)Chrome浏览器/ Safari浏览器39.0.2171.71/537.36”)

编辑: 这个问题似乎是最反感与由Require.js加载的文件,虽然我已经遇到它与JavaScript中直接引用的JavaScript以及。

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

回答

2

事实证明,当服务器响应中未指定Cache-Control头时(至少在没有指定缓存行为时),浏览器在缓存方面的记录行为很差。一般来说,在这种情况下,浏览器根据文件的最后修改日期(如果在响应中声明),当前日期以及当前日期来确定要缓存项目的时间长度。

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

可悲的是,谷歌对HTTP缓存官方页面没有提到如果头没有设置发生了什么:

编辑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?