Chrome不会缓存图片/JavaScript/CSS文件

71

当Chrome加载我的网站时,它会在显示文件之前检查服务器是否有更新的版本。(图片/JavaScript/CSS) 由于我从未编辑过外部JavaScript、CSS或图像,因此它从服务器得到了304。

我希望它能够直接显示图像,而不必检查服务器。

以下是头信息:

Connection:keep-alive    
Date:Tue, 03 Aug 2010 21:39:32 GMT    
ETag:"2792c73-b1-48cd0909d96ed"    
Expires:Thu, 02 Sep 2010 21:39:32 GMT    
Server:Apache/Nginx/Varnish

如何使它不检查服务器?


你有查看过 https://dev59.com/I6Xja4cB1Zd3GeqPMSD7 吗? - german1410
6个回答

121

请确保在开发者工具中,禁用缓存 复选框未被勾选/禁用。


5
这帮助我解决了同样的问题。如果你们也遇到了困难,在开发者工具中,请点击右下角的齿轮图标。 - Kayla
4
想到我差点要写一个图片服务页面来强制缓存控制,谢谢你! - Reinstate Monica Cellio
9
我刚刚举起双臂,要求上帝惩罚我犯的愚蠢错误。同时也禁用了缓存... - TheBokiya
7
问题存在于我的键盘和椅子之间。 - Travis D

90
你的请求头是什么样子的?
当你在地址栏中按下回车键时,Chrome会在请求的Cache-Control头上设置max-age:0。如果你使用超链接访问页面,则应该像预期的那样使用缓存。请注意,保留""和""和html标签。

3
页面刷新时,请求头也会被设置为max-age:0,这是有道理的。使用链接进行测试。 - Haroldo
@thedk:旧问题,但对于Apache,这些htaccess命令将起作用:FileETag None; Header unset ETag; Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"; Header set Pragma "no-cache"; Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"(使用换行符替换“;”!)- 如果只是用于开发,则可以在Chrome开发者工具的设置菜单中启用“禁用缓存”。 - Jörn Berkefeld
@这是另一种方式。 - Lukasz Madon
1
@ChrisNicholson:这对我现在有效。我使用了后退/前进按钮来消除服务器往返。 - Jonas Byström
3
A) 如果您在Chrome浏览器中使用地址栏进行刷新,它也会设置max-age:0。 B) 火狐浏览器中似乎也存在这两种行为。至于其他浏览器则无法确定。 - J-bob
显示剩余5条评论

60

哇!我也一直遇到同样的问题。

我告诉你为什么会出现这种问题。你的请求头没问题。你接收到304状态码是因为你刷新页面的方式不正确。主要有以下3种方式:

  1. 在地址栏按回车键。你会发现Chrome先从缓存中读取文件,而没有去服务器获取。

  2. 按下F5,这将验证文件是否已经过期(可能是你刷新的方法)。

  3. 按下Ctrl+F5,这是对所有静态资源进行无条件重新加载。

所以基本上,你应该在地址栏按回车键。让我知道这是否有效。


3
在地址栏中按Enter键仍会重新加载页面。将URL复制粘贴到新标签页或同一标签页中,然后按Enter键不会重新加载页面。 - tarkeshwar
Google Chrome 版本 58.0.3029.110 - 在地址栏中按 Enter 键无法工作,但将 URL 复制粘贴到新标签页中,然后按 Enter 键可以工作...因为某些原因... :) - gorjanz
@Tushar - 有没有什么方法可以在按下F5时避免向服务器发送请求?目前它会发送请求到服务器,然后服务器回复304,然后它从缓存中加载。我希望浏览器直接从缓存中加载资源,而不是向服务器发出请求,因为我的资源可用于磁盘缓存。 - Debajit Majumder

48

对我来说,问题出在自签名证书上:

https://code.google.com/p/chromium/issues/detail?id=110649

在上述链接中,Chromium开发者标记了这个问题:#WontFix ,因为规则是:“任何与证书相关的错误都意味着页面无法被缓存”。

因此,Chrome不能缓存来自使用自签名证书服务器的资源。


1
页面上有很多好的答案,但这必须是任何https页面的关键第一步。 - brianlmerritt
2
我遇到了相同的问题。有没有解决方法? - Tumaini Mosha
你救了我的一天! - labilbe
现在正在缓存中。版本为63(mac OS)。 - Yevgeniy Afanasyev
这也是我的原因,谢谢 :) - LAZ
显示剩余2条评论

7
如果您希望Chrome缓存您的JS/CSS文件,服务器需要设置一个“Cache-Control”头信息。它应该如下所示:

Cache-Control:max-age=86400(如果您希望将资源缓存一天)。


谢谢回复。以下是新的标头:Cache-Control:max-age=2592000 Connection:keep-alive Date:Tue, 03 Aug 2010 21:57:36 GMT ETag:"2792c73-b1-48cd0909d96ed" Expires:Thu, 02 Sep 2010 21:57:36 GMT Server:Apache/Nginx/Varnish但它仍然无法正常工作。Chrome仍会检查服务器是否有修改。 - Roger
你是如何确保Chrome检查服务器的修改?你是否使用类似Fiddler的工具? - Rahul
@Rahul 在Chrome中按Ctrl-Shift-I - Pacerier
注意:Chrome默认会缓存JS/CSS文件,对于普通页面加载而言,即使没有Cache-Control头信息也会进行缓存。但在页面刷新或强制刷新时,浏览器会从服务器重新获取最新的文件。 - Bryce
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - webjockey

1
我相信你正在寻找的是:

缓存控制: 不可变


目前只有支持此功能的浏览器是Firefox和Edge。 - Gary van der Merwe
Chrome和Safari也支持它。请查看https://dev59.com/QFgQ5IYBdhLWcg3w-o1w 如果您无法控制客户端,我相信这是解决方案。 - Ashutosh Sharma

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