Pytanie Jak kontrolować buforowanie dla zasobów statycznych podczas używania Sinatry? [Zamknięte]


Używam najnowszego Sinatry i hostuję na Heroku. Czy istnieje sposób, w jaki można ustawić nagłówki buforowania dla moich zasobów statycznych obsługiwanych z /public informator?

Sinatra serwuje pliki z /public katalog przed sprawdzeniem wszystkich tras, które zostały zdefiniowane, więc nie mogę po prostu cache_control metoda wewnątrz trasy.

The /public katalog zawiera kod CSS i JavaScript mojej aplikacji. Nie chcę, aby przeglądarka pobierała te pliki za każdym razem, ponieważ nie będą się one często zmieniać.


11
2017-10-10 18:32


pochodzenie


Czy możesz wyjaśnić nieco dokładniej, dlaczego chcesz to zrobić? Co chcesz osiągnąć? - the Tin Man
Ehm. Obsługuję CSS i JavaScript, które nie zmieniają się zbyt często, więc nie chcę, aby przeglądarka ładowała plik za każdym razem, ale aby buforować go, dopóki nie prześlę nowej wersji. - js-coder
Czy możesz zdefiniować "to nie działało" lepiej? - the Tin Man
Kiedy sprawdziłem nagłówki, powiedzieli max_age: 0. - js-coder
Pytanie to zostało zamknięte, ponieważ nie można było "rozsądnie odpowiedzieć" po tym, jak udało się mu odpowiedzieć. o.0 - js-coder


Odpowiedzi:


Możesz użyć static_cache_control oprawa ustawić Cache-Control nagłówek dla plików statycznych obsługiwanych przez Sinatrę:

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

Uwaga: musisz użyć jawnej tablicy [...].

Dotyczy to również wszystkich plików w public katalogu, tzn. nie można określać innych nagłówków dla plików css i javascript.

(Jeśli jesteś nie używając Heroku i korzystasz z Apache lub Nginx do wyświetlania plików statycznych, to nie zadziała, w takim przypadku musisz osobno skonfigurować swój serwer WWW).


13
2017-10-10 21:51



Dzięki, to działa idealnie. :) Działa również lokalnie, ponieważ używam stelaża też, jak sądzę. Tylko ostatnie pytanie: kiedy zmienię plik, czy nowy plik zostanie załadowany automatycznie, czy też muszę go włączyć, dodając parametr url (np. ?#{File.mtime(filename)})? - js-coder
@dotweb nie, nowy plik nie zostanie załadowany automatycznie (to raczej kwestia buforowania, przeglądarka nawet nie poprosi o to, aby nie było wiadomo, że jest nieaktualny). Musisz użyć jakiegoś URL-a lub nazwy wersji dla swoich plików. - matt
Tak, po prostu nie byłam pewna, czy serwer ma już jakiś sposób, żeby powiedzieć przeglądarce, aby ponownie odświeżyła pamięć podręczną po wykryciu nowej wersji. Tak czy inaczej, po prostu użyję par parametrów, dzięki za twoją pomoc. :) - js-coder


Stworzyłem prostą stronę Sinatry, używając:

#!/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

Kiedy poprosiłem "/", Mam te nagłówki:

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

Kiedy poprosiłem "/public/foo", Mam te:

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

Działa na obecnym Sinatrze (1.3.3) na Ruby 1.9.3p194.


1
2017-10-10 19:38



Och, może nie wyjaśniłem tego wystarczająco szczegółowo. W folderze / public w mojej aplikacji (nie w / public url) znajdują się wszystkie pliki, które można przeglądać bezpośrednio (plik /public/app.js może być dostępny w /app.js bez dodawania trasy do kodu Ruby .) Chcę, aby te pliki były buforowane. Teraz widzę, że to, co próbowałem, nie zrobiło tego, czego chciałem. - js-coder