在Rails 3.1开发模式中(使用资产管道时),使用响应标题“Cache Control:must-revalidate”提供由资源/图像提供的图像。
这意味着即使在单页浏览中,Google Chrome(以及看似只有Chrome)也会尝试多次重新获取图片。这导致了通过JavaScript进行DOM操作的所有方式的棘手问题。仅举几例:
我完全可以理解为开发服务器做一件合理的事情。我甚至可以理解,即使在单页视图中,Chrome也拒绝缓存图像,这是非常合理的。
那么,有没有办法更改Rails应用于开发中的图像响应的Cache Control标头?
更新:正如一些人所建议的那样,一个更有趣的问题是,为什么当没有其他浏览器时,Chrome会尝试在网页浏览中多次重新获取图片? (为什么这不会给其他开发者带来问题?)
更新x2:我不打算将此作为答案提交,因为这只是一个适合我的目的的解决方法,但我们能够通过预编译资产来解决这个问题然后丢弃预先编译的CSS& JS。 (这将要求sprockets调试在development.rb
中变为false。)
rake assets:precompile
cd public/assets
find . -name "*.js*" -exec rm -rf {} \;
find . -name "*.css*" -exec rm -rf {} \;
答案 0 :(得分:4)
我看到操纵资产的Cache-Control标头的唯一方法是使用以下命令配置静态资产:
config.serve_static_assets = true
config.static_cache_control = "public, max-age=3600"
答案 1 :(得分:1)
Sprockets要么发送缓存标头,要么强制重新验证(参见the source)。
我看不到公开可用的选项来更改此行为。
要修改这个,我想你将不得不修补Sprockets。
可能更感兴趣的是为什么Chrome会以这种方式行事?
答案 2 :(得分:1)
http://code.google.com/p/chromium/issues/detail?id=102706
这似乎是Chrome的文档问题。我遇到了同样的问题:添加或删除引用图像的CSS类会闪烁或调整大小,而图像请求(总是返回304未修改)正在进行中。
答案 3 :(得分:0)
您不需要将资产编译为公共/资产并删除* js * css来缓存图像
您可以在机架中缓存图片,https://github.com/mvj3/rack_image_assets_cache_control