我正在使用最新的 Sinatra,并且在 Heroku 上托管。有没有办法可以为从/public
目录提供的静态资产设置缓存标头?
Sinatra 在检查任何已定义的路由之前从/public
目录中提供文件,因此我不能只cache_control
使用路由中的方法。
该/public
目录包含我的应用程序的 CSS 和 JavaScript。我不希望浏览器每次都下载这些文件,因为它们不会经常更改。
您可以使用该static_cache_control
设置Cache-Control
为Sinatra 提供的静态文件设置标头:
set :static_cache_control, [:public, max_age: 60 * 60 * 24 * 365]
请注意,您需要使用显式数组[...]
。
这也将适用于public
目录中的所有文件,即您不能为 css 和 javascript 文件指定不同的标题。
(如果您没有使用 Heroku 并且使用 Apache 或 Nginx 来提供静态文件,那么这将不起作用,在这种情况下,您需要单独配置您的网络服务器)。
我使用以下方法创建了一个简单的 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)。