谷歌浏览器不会缓存图片

Pat*_*ard 9 caching assets google-chrome ruby-on-rails

我正在尝试在Ruby on Rails中优化我的应用程序,我意识到我的应用程序中的图片是加载所需的最长时间,但我也注意到另一个问题,即谷歌浏览器没有缓存图像.

我注意到这一点,因为在Google Developers Console中,您可以看到Google Chrome会请求加载在图像真正加载之前取消的图像.

这可以在这里看到,首先我打开谷歌开发者控制台,然后刷新页面,在第一个请求中你可以看到图像,但它们会立即被取消.

google_not_caching

之后,您可以看到实际加载图像的请求.

在此输入图像描述

我不明白为什么会出现这种情况,如果在响应头,你可以看到,Cache Control被设定为publicmax-age = 31536...

response_header

我把这些图像放在我的应用程序中:

<div class="col-xs-3"><%= image_tag "#{@hero.id}/ability_1.png", class: "center-block"%></div>
Run Code Online (Sandbox Code Playgroud)

并且图像被组织在文件夹中 app/assets/images

有没有RoR方法来解决这个问题?

编辑:现在在Windows中测试我的应用程序(在Heroku中)我注意到事实上Google Chrome有时会缓存图像,但它发生在50%的时间(当我在Ubuntu开发时它不起作用一个单一的时间),而在Firefox中首次图像加载,但随后的时间我打开我甚至无法注意到重装了同样的观点,这是beatiful,为什么谷歌Chrome是不是这样呢?谷歌浏览器行为如此奇怪是正常的吗?

oma*_*ous 8

分析浏览器缓存时最重要的事情是"状态代码".在您的示例中,您可以看到您有一个"304",表示"未修改",这意味着浏览器"可能会使用它的缓存".所以你实际上是在缓存.缓存!=没有命中你的网络服务器.

根据Mozilla的定义:

这用于缓存目的.它告诉客户端响应未被修改.因此,客户端可以继续使用相同的缓存版本的响应.

它将etag和最后修改后的内容发送到您的Web服务器,然后您的Web服务器查看这些元数据并说"不,这个文件没有改变,所以随意使用您的缓存",就是这样.它实际上不会再次发送文件.您可以看到"大小"远小于它是"200"状态代码,其中Web服务器正在发送文件,并且时间也应该短得多.

在Chrome中,您可以通过选中"网络"标签中的"禁用缓存"选项来强制"非缓存".

希望有所帮助!

  • +1 对 304 的清晰解释,但我认为这并没有真正解决 OP 的基本问题:鉴于 `Cache-Control` 响应标头中的 `max-age` 设置,为什么 Chrome 会发出条件 GET 请求? (2认同)