【问题标题】:How can I control caching for static assets when using Sinatra? [closed]使用 Sinatra 时如何控制静态资产的缓存? [关闭]
【发布时间】:2012-10-01 07:38:15
【问题描述】:

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

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

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

【问题讨论】:

  • 您能否更清楚地解释一下您为什么要这样做?你想完成什么?
  • 嗯。我提供的 CSS 和 JavaScript 变化不大,所以我不希望浏览器每次都加载文件,而是缓存它直到我上传新版本。
  • 你能更好地定义“它不起作用”吗?
  • 当我检查标题时,他们说 max_age: 0.
  • 所以这个问题被关闭了,因为它在成功回答后无法“合理回答”。 o.0

标签: ruby heroku sinatra


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 谢谢,这很好用。 :) 它也可以在本地工作,因为我想我也在那里使用 rack 。最后一个问题:当我更改文件时,新文件会自动加载,还是我需要通过附加一些 url 参数来触发它(如?#{File.mtime(filename)})
  • @dotweb 不,新文件不会自动加载(这几乎是缓存的重点,浏览器甚至不会要求它,所以它无法知道它已经过时了)。您需要为您的文件使用某种 url 参数或版本名称。
  • 是的,我只是不确定服务器是否已经有办法告诉浏览器在检测到新版本时重新更新缓存。无论如何,我将只使用 url 参数,感谢您的帮助。 :)
【解决方案2】:

我使用以下方法创建了一个简单的 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)。

【讨论】:

  • 哦,可能我解释的不够详细。在我的应用程序的 /public 文件夹中(不是 /public url),是所有可以直接查看的文件(文件 /public/app.js 可以在 /app.js 访问,而无需添加到 Ruby 代码的路由.) 我希望缓存这些文件。现在我发现我尝试过的并没有达到我真正想要的效果。
猜你喜欢
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2023-03-26
  • 2015-08-19
  • 1970-01-01
  • 2021-02-21
  • 2020-08-05
  • 1970-01-01
相关资源
最近更新 更多