11

我正在使用最新的 Sinatra,并且在 Heroku 上托管。有没有办法可以为从/public目录提供的静态资产设置缓存标头?

Sinatra 在检查任何已定义的路由之前从/public目录中提供文件,因此我不能只cache_control使用路由中的方法。

/public目录包含我的应用程序的 CSS 和 JavaScript。我不希望浏览器每次都下载这些文件,因为它们不会经常更改。

4

2 回答 2

15

您可以使用该static_cache_control设置Cache-Control为Sinatra 提供的静态文件设置标头:

set :static_cache_control, [:public, max_age: 60 * 60 * 24 * 365]

请注意,您需要使用显式数组[...]

这也将适用于public目录中的所有文件,即您不能为 css 和 javascript 文件指定不同的标题。

(如果您没有使用 Heroku 并且使用 Apache 或 Nginx 来提供静态文件,那么这将不起作用,在这种情况下,您需要单独配置您的网络服务器)。

于 2012-10-10T21:51:17.133 回答
1

我使用以下方法创建了一个简单的 Sinatra 站点:

#!/usr/bin/env ruby

require 'sinatra'

get '/public/*' do
  cache_control :public, max_age: 60 * 60 * 24 * 365
  'this is public'
end

get '/' do
    'hello world!'
end

当我请求“ /”时,我得到了这些标题:

x-frame-options: sameorigin
x-xss-protection: 1; mode=block
Content-Type: text/html;charset=utf-8
Content-Length: 12
Connection: keep-alive
Server: thin 1.5.0 codename Knife

200 OK

当我要求' /public/foo'时,我得到了这些:

x-frame-options: sameorigin
x-xss-protection: 1; mode=block
Content-Type: text/html;charset=utf-8
Cache-Control: public, max-age=31536000
Content-Length: 14
Server: thin 1.5.0 codename Knife

200 OK

它正在 Ruby 1.9.3p194 上处理当前的 Sinatra (1.3.3)。

于 2012-10-10T19:38:00.613 回答