2009-04-02 13 views
138

Ubuntu -> Apache -> Phusion passeggeri -> Rails 2.3Come prevenire il browser caching delle pagine in Rails

La parte principale del mio sito reagisce ai tuoi scatti. Quindi, se fai clic su un link, ti ​​invierà a destinazione e rigenererai istantaneamente la tua pagina.

Ma, se si preme il pulsante Indietro, non si vede la nuova pagina. Sfortunatamente, non viene visualizzato senza un aggiornamento manuale; sembra che il browser la stia memorizzando nella cache. Voglio assicurarmi che il browser non memorizzi nella cache la pagina.

Separatamente, I do si desidera impostare le date di scadenza del futuro per tutte le mie risorse statiche.

Qual è il modo migliore per risolvere questo problema? Dovrei risolvere questo in Rails? Apache? Javascript?

Grazie per tutto il vostro aiuto, Jason


ahimè. Nessuno di questi suggerimenti ha forzato il comportamento che sto cercando.

Forse c'è una risposta javascript? Potrei avere i binari scrivere un timestamp in un commento, quindi fare in modo che JavaScript verifichi se i tempi sono entro cinque secondi (o qualsiasi cosa funzioni). Se sì, allora va bene, ma se no, quindi ricaricare la pagina?

Pensi che questo funzionerebbe?

Grazie per tutto il vostro aiuto,

Jason

risposta

305

Infine capito questo - http://blog.serendeputy.com/posts/how-to-prevent-browsers-from-caching-a-page-in-rails/ in 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

Grazie ... mi ha risparmiato un sacco di tempo! – mikeymo

+0

Dopo due giorni di ricerche ho finalmente trovato questa risposta. Grazie mille ^^ – StefanS

+1

Ho solo bisogno di aggiungere al coro e dire grazie (!!!) per questa risposta. Ho avuto questo problema * troppo a lungo *. –

3

ho usato questa linea con un certo successo nel controller. Funziona in Safari e Internet Explorer ma non l'ho visto funzionare con Firefox.

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

Per il secondo punto, se si utilizzano i metodi di supporto delle rotaie, come

stylesheet_link_tag 

e lasciare le impostazioni di default sul vostro server web, le attività sono in genere memorizzati nella cache abbastanza bene.

+3

'1.y..ago' non è necessario. Basta scegliere un tempo arbitrario in passato come "Ven, 01 gen 1990 00:00:00 GMT' – Archonic

1

Il modo più pulito sarebbe quello di scrivere un middleware cremagliera, che modifica l'intestazione Cache-Control basato su una logica (ad esempio, solo per l'applicazione/xml mime-type). Oppure, per un approccio più brutto, ma ancora funzionante, è possibile modificare la costante ActionDispatch :: Response :: DEFAULT_CACHE_CONTROL in "no-cache". Ovviamente, se è richiesto il controllo e/o la granularità delle azioni, è meglio farlo nel controller.

13
+2

Questo non ha funzionato per me in Chrome 21.0.1180.57. – Akrikos

+1

'expires_now' invia solo l'intestazione' no-cache'. A seconda del browser questo potrebbe non essere sufficiente. (Ad esempio, Firefox desidera un 'no-store' per le connessioni non HTTPS: https://developer.mozilla.org/en/docs/Using_Firefox_1.5_caching) –

+1

Questo non funziona! – rardoz

0

punto di nota: Non è possibile condizionale chiaro la cache (come se un before_filter chiamate solo reset_cache se l'utente già lì).È necessario incondizionatamente cancellare la cache, perché il browser non farà una nuova richiesta solo per vedere se questa volta, ha bisogno di ricaricare, anche se non ha bisogno di durare il tempo.

Esempio:

before_filter :reset_cache, if: :user_completed_demographics? 

non funzionerà per impedire agli utenti di tornare dopo essere stati lì, dal momento che il browser utilizza le intestazioni di cache originali sul pulsante Indietro.

before_filter :reset_cache 

funzionerà, però (dopo aggiornare la pagina e svuotare la cache da prima si è aggiunto questo, ovviamente), dal momento che, alla prima richiesta, il browser otterrà il no-cache, no-store, ... e applicarlo ai futuri caricamento della pagina.

Problemi correlati