将Expires标头添加到rails资产

时间:2017-08-24 07:42:10

标签: ruby-on-rails heroku http-headers

我目前正在构建rails应用程序并尝试提高其页面速度洞察力标记。剩下的唯一警告就是我的资产标题。

在查看rails文档和互联网上的一些文章之后,这是我在production.rb文件中提出的内容:

config.public_file_server.headers = {
    'Cache-Control' => 'public, s-maxage=31536000, max-age=86400',
    'Expires' => "#{1.day.from_now.httpdate}"
}

现在,这是我的js / css文件的chrome网络选项卡中显示的内容:

cache-control:public, max-age=86400
content-encoding:gzip
content-length:90444
content-type:application/javascript
date:Tue, 22 Aug 2017 10:49:05 GMT
last-modified:Tue, 22 Aug 2017 08:49:06 GMT
server:...

缓存控件按原样出现,但没有过期标头。

我也使用cloudfront,但我不确定我是否应该/可以改变那里的标题。

我做错了吗?

2 个答案:

答案 0 :(得分:2)

如果您使用的是Rails 4 ,则只能为Rails提供的资产设置Cache-Control响应标头。这是一个限制。

您的解决方案适用于 Rails 5
Rails 5源代码中有一个测试,它确保响应中包含自定义标头:

  def test_serves_files_with_headers
    headers = {
      "Access-Control-Allow-Origin" => "http://rubyonrails.org",
      "Cache-Control"               => "public, max-age=60",
      "X-Custom-Header"             => "I'm a teapot"
    }

    app      = ActionDispatch::Static.new(DummyApp, @root, headers: headers)
    response = Rack::MockRequest.new(app).request("GET", "/foo/bar.html")

    assert_equal "http://rubyonrails.org", response.headers["Access-Control-Allow-Origin"]
    assert_equal "public, max-age=60",     response.headers["Cache-Control"]
    assert_equal "I'm a teapot",           response.headers["X-Custom-Header"]
  end

此外,即使您以某种方式添加Expires标题,max-age也会优先。

答案 1 :(得分:1)

config.public_file_server.headers = {
    'Cache-Control' => 'public, s-maxage=31536000, max-age=86400',
    'Expires' => "#{1.day.from_now.to_formatted_s(:rfc822)}"
}

试试这个