Как я могу контролировать кеширование статических активов при использовании 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.