2016-02-13 119 views
8

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

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

这可以在这里看到,首先我打开Goog​​le Developers Console,然后刷新页面,在第一个请求中可以看到那些图像,但它们会立即取消。

google_not_caching

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

enter image description here

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

response_header

我把图像在我这样申请:

<div class="col-xs-3"><%= image_tag "#{@hero.id}/ability_1.png", class: "center-block"%></div> 

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

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

编辑:现在测试我的应用程序(这是在Heroku上)在Windows中我注意到,其实谷歌浏览器有时缓存图像,但它偏偏喜欢时代的50%(当我在Ubuntu中开发它没有工作一次),而在Firefox第一次图像加载,但随后的时间我加载相同的看法,我甚至无法注意到重新加载,这是美丽的,为什么谷歌铬不是这样的?谷歌浏览器行为如此怪异是正常的吗?

回答

8

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

根据Mozilla定义:

这是用于高速缓存的目的。它告诉客户,响应没有被修改。所以,客户端可以继续使用相同的缓存版本的响应。

它将etag和最后修改的内容发送到您的Web服务器,然后您的Web服务器查看这些内容并说“不,这个文件没有改变,所以随意使用您的缓存”而已。它实际上不会再发送文件。你可以看到,当它是一个“200”状态代码时,“尺寸”远远小于Web服务器发送文件的时间,并且时间也应该更短。

在Chrome中,您可以通过选中网络选项卡中的“禁用缓存”选项来强制执行“非缓存”。

希望有帮助!

+1

+1对于304的清晰解释,但我不认为这真的解决了OP的基本问题:为什么Chrome会根据'Cache-Control'中的'max-age'设置完成条件GET请求'响应头? – eaj

1

请求标头包含max-age = 0。尝试将其设置为大数字!