Rails:即使启用了资产摘要,浏览器也会重新验证资产

时间:2013-03-03 06:37:01

标签: ruby-on-rails ruby-on-rails-3.1 asset-pipeline

我一直试图摆脱浏览器为我们的Rails应用程序做出的重新验证请求。我打开资产摘要:

      config.assets.digest = true

并希望304的消失。但他们没有(资产是md5'):

Started GET "/assets/bootstrap/bootstrap-4379dca12de4846777a274a301167a41.css" for 192.168.56.1 at Sun Mar 03 00:34:22 +0100 2013
[INFO  pid: 3967: 13-03-03 00:34:22 ] Served asset /bootstrap/bootstrap-4379dca12de4846777a274a301167a41.css - 304 Not Modified (5ms)

供参考 - 这是页面中的原始html:

  <link href="/assets/bootstrap/bootstrap-4379dca12de4846777a274a301167a41.css" media="screen" rel="stylesheet" type="text/css" />

我使用curl检查了缓存标头 - 它们看起来很好:

< Content-Type: text/css
< Connection: keep-alive
< Status: 200
< X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.11
< ETag: "4379dca12de4846777a274a301167a41"
< X-UA-Compatible: IE=Edge
< Last-Modified: Tue, 26 Feb 2013 08:03:21 GMT
< X-Rack-Cache: miss, store
< X-Content-Digest: 97d1f611b557f55fa917899bca0ef9b674d65a6a
< X-Runtime: 0.023510
< Date: Sat, 02 Mar 2013 23:43:37 GMT
< Content-Length: 141338
< Cache-Control: public, max-age=31536000
< Age: 0
< Server: nginx/1.0.10 + Phusion Passenger 3.0.11 (mod_rails/mod_rack)

如果我直接从浏览器加载这个css URL - 那么浏览器似乎会缓存它。 (刷新不会在rails日志上生成GET)。但是,当我加载我的应用程序页面时 - 它总是发出重新验证,导致304。

我玩弄了这些设置(真/假,存在/不存在)(几乎尝试了所有组合)(并且总是删除tmp / cache只是为了安全起见):

config.assets.compile = true
config.static_cache_control = "public, max-age=30758400"
config.serve_static_assets = true

但没有任何帮助。我已经读过某个地方'Etag'标题是问题 - 但我无法弄清楚如何关闭Etag标题(无论我做什么 - 总是返回etag标题)。 (我无法弄清楚为什么官方食谱不起作用)。

这是处于开发模式 - 但我已经更改了配置设置,如上所示。没有预编译。

有关如何关闭重新验证的任何帮助都非常感谢。

1 个答案:

答案 0 :(得分:2)

Rails可能不会添加这些头文件... nginx是。查看Rails指南部分(向下滚动到4.1.1):

http://edgeguides.rubyonrails.org/asset_pipeline.html#precompiling-assets

特别是“For nginx”部分:

location ~ ^/assets/ {
  expires 1y;
  add_header Cache-Control public;

  add_header ETag "";
  break;
}