谷歌浏览器中缓存未被清除

16
当我部署版本时,我会像以下这样,将数字作为查询字符串添加到JavaScript和CSS文件中吗?
'app/source/scripts/project.js?burst=32472938'

我使用上述代码刷新浏览器缓存。

但是在Firefox中,我获取到了我修改的最新脚本。 但是在Chrome中,我没有获取到我修改的最新脚本。相反,我得到了旧版本。

但是在开发者控制台中,我看到了被修改后的缓存编号。


你的项目使用服务工作者吗? - Jacob Phillips
5个回答

12
根据 Google 文档,使文件失效并重新加载的最佳方法是将版本号添加到文件名中,而不是作为查询参数:
'app/source/scripts/project.32472938.js' 以下是文档链接:
https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching#invalidating_and_updating_cached_responses 另一种方法是使用 ETag(验证令牌):
https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching#validating_cached_responses_with_etags 以下是如何在 Nginx 中设置 ETag:
http://nginx.org/en/docs/http/ngx_http_core_module.html#etag 最后,关于使用Nginx和ETag实现浏览器缓存的教程:
https://www.digitalocean.com/community/tutorials/how-to-implement-browser-caching-with-nginx-s-header-module-on-centos-7#step-2-%14-checking-the-default-behavior

第一个链接不再指向原始文章。https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching - SpringMaple

2
我不确定这是否仍然适用,但过去有一些情况下代理可能会导致查询字符串值被忽略以实现缓存。2008年的一篇文章讨论了查询字符串值不是打破缓存的理想方式,最好修改文件名本身--因此,引用project_32472938.js而不使用查询字符串。
(我还在某些地方看到了一些讨论特殊情况的讨论,某些客户端没有看到这些更新,但似乎不一致--不一定与Chrome有关,更可能与特定机器上的特定Chrome安装有关。我肯定建议在另一台电脑上检查网站,以查看问题是否重复,因为您至少可以缩小范围,确定是Chrome总体存在问题,还是您的特定Chrome安装存在问题。)
话虽如此,自2008年以来已经过了很长时间,这可能不再适用。但是,如果它继续成为问题 - 并且您找不到解决根本问题的方法 - 它至少提供了一种用于规避它的方法。

1

我认为Chrome并不会导致问题,因为这几乎会破坏所有Web应用程序 (例如:https://www.google.com/search?q=needle

可能是您的部署有点延迟,例如:

  1. 开始安装新脚本
  2. 使用Chrome进行检查(接收到新ID的旧版本)
  3. 安装完成
  4. 您尝试使用Firefox(接收到新版本)
  5. Chrome仍显示旧版本,因为它缓存了新ID的旧脚本

或者您的Web服务器和浏览器之间有Azure等CDN。

使用标准设置,Azure CDN忽略缓存哈希的查询字符串。


1

try those meta tags:

<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />

希望如果我设置了这个,就不会有任何缓存了.. :-( - Jeeva J

0

我不确定,但可以试一下...

谷歌浏览器总是忽略它...

每次在您的网站上按下链接时,您需要为每个链接添加“?random.number”或“?date.code”。例如,如果缓存中存储了“myhomepage.html?272772”,则通过生成一个新的随机数,例如“myhomepage.html?2474789”,谷歌浏览器将被迫寻找一个新的副本。


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