Как я могу контролировать кеширование статических активов при использовании Sinatra?

Я использую последнюю Sinatra, и я хожу на Heroku. Есть ли способ настроить кеширующие заголовки для моих статических ресурсов, которые обслуживаются из каталога /public?

Sinatra обслуживает файлы из каталога /public, прежде чем проверять все маршруты, которые были определены, поэтому я не могу использовать метод cache_control внутри маршрута.

Каталог /public содержит CSS и JavaScript моего приложения. Я не хочу, чтобы браузер загружал эти файлы каждый раз, так как они не будут меняться часто.

Ответ 1

Вы можете использовать параметр static_cache_control для установки заголовка Cache-Control для статических файлов, обслуживаемых Sinatra:

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

Обратите внимание, что вам нужно использовать явный массив [...].

Также это применимо ко всем файлам в каталоге public, т.е. вы не можете указать разные заголовки для файлов css и javascript.

(Если вы не используете Heroku и используете Apache или Nginx для обслуживания статических файлов, тогда это не будет работать, в этом случае вам нужно будет настроить ваш веб-сервер отдельно).

Ответ 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

Он работает над текущей синатрой (1.3.3) на Ruby 1.9.3p194.