2009-04-02 15 views
138

Ubuntu -> Apache -> Phusion pasażera -> Rails 2.3Jak zapobiec przeglądarki stronę buforowanie w Rails

Główną częścią mojej strony reaguje na kliknięcia. Jeśli klikniesz link, wyślesz go do miejsca docelowego i natychmiast odtworzysz stronę.

Ale jeśli naciśniesz przycisk Wstecz, nie zobaczysz nowej strony. Niestety, nie wyświetla się bez ręcznego odświeżania; wygląda na to, że przeglądarka go buforuje. Chcę się upewnić, że przeglądarka nie buforuje strony.

Oddzielnie, I do chcę ustawić daty przyszłych dat wygaśnięcia dla wszystkich moich zasobów statycznych.

Jaki jest najlepszy sposób rozwiązania tego problemu? Czy powinienem rozwiązać to w Railsach? Apache? JavaScript?

Dzięki za pomoc, Jason


Alas. Żadna z tych sugestii nie wymusiła zachowania, którego szukam.

Może jest odpowiedź javascript? Mogę mieć szyny wypisywać znacznik czasu w komentarzu, a następnie sprawdzić javascript, aby zobaczyć, czy czasy są w ciągu pięciu sekund (lub cokolwiek działa). Jeśli tak, to dobrze, ale jeśli nie, to ponownie załaduj stronę?

Czy uważasz, że to zadziała?

Dzięki za pomoc,

Jason

Odpowiedz

305

końcu zorientowali to out - http://blog.serendeputy.com/posts/how-to-prevent-browsers-from-caching-a-page-in-rails/ w application_controller.rb

class ApplicationController < ActionController::Base 

before_filter :set_cache_headers 

    private 

    def set_cache_headers 
    response.headers["Cache-Control"] = "no-cache, no-store" 
    response.headers["Pragma"] = "no-cache" 
    response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT" 
    end 
end 
+5

Dzięki ... zaoszczędzisz mi mnóstwo czasu! – mikeymo

+0

Po dwóch dniach poszukiwań znalazłem wreszcie tę odpowiedź. Dzięki za milion^^ – StefanS

+1

Po prostu muszę dodać do chóru i podziękować (!!!) za tę odpowiedź. Mam problem z * zbyt długim *. –

3

Użyłem tej linii z pewnym sukcesem w kontrolerze. Działa w Safari i Internet Explorerze, ale nie widziałem, żeby działał z Firefoksem.

response.headers["Expires"] = "#{1.year.ago}" 

Dla drugiego punktu, jeśli używasz metody pomocnika szyn jak

stylesheet_link_tag 

i pozostawić domyślne ustawienia na swoim serwerze, aktywa są zwykle buforowane całkiem dobrze.

+3

'1.year.ago' jest niepotrzebny narzut. Po prostu wybierz jakiś arbitralny czas w przeszłości: "Fri, 01 stycznia 1990 00:00:00 GMT" – Archonic

1

Odkurzacz sposób byłoby napisać middleware Rack, która zmienia nagłówek Cache-Control oparty na jakiejś logiki (na przykład tylko dla application/xml typ mime). Lub, dla brzydszego, ale wciąż działającego podejścia, można zmienić stałą ActionDispatch :: Response :: DEFAULT_CACHE_CONTROL na "no-cache". Oczywiście, jeśli kontroler i/lub granulacja akcji jest wymagana, lepiej jest to zrobić w kontrolerze.

13
+2

To nie działa dla mnie w Chrome 21.0.1180.57. – Akrikos

+1

'expires_now' wysyła tylko nagłówek' no-cache'. W zależności od przeglądarki może to nie wystarczyć. (Na przykład Firefox chce "nie przechowywać" dla połączeń nie HTTPS: https://developer.mozilla.org/en/docs/Using_Firefox_1.5_caching) –

+1

To nie działa! – rardoz

0

Punkt Uwaga: Nie można warunkowo jasne cache (jak gdyby before_filterreset_cache wywołuje tylko wtedy, gdy użytkownik już tam).Musisz bezwarunkowo wyczyścić pamięć podręczną, ponieważ przeglądarka nie złoży nowego żądania tylko po to, aby sprawdzić, czy tym razem będzie musiała zostać ponownie załadowana, nawet jeśli nie była potrzebna do ostatniego użycia.

Przykład:

before_filter :reset_cache, if: :user_completed_demographics? 

nie będzie działać, aby uniemożliwić użytkownikom wraca po oni byli tam, ponieważ przeglądarka wykorzystuje oryginalne nagłówki cache na przycisk Wstecz.

before_filter :reset_cache 

będzie działać, jednak (po odświeżeniu strony i wyczyszczenie pamięci podręcznej z przed dodaniem tego, oczywiście), ponieważ na pierwsze żądanie, przeglądarka dostanie no-cache, no-store, ... i zastosować go do przyszłych załadowaniu strony.

Powiązane problemy