Come evitare la memorizzazione nella cache della pagina del browser in Rails

Ubuntu -> Apache -> Phusion Passenger -> Rails 2.3

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

Ma, se premi il pulsante Indietro, non vedi 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, desidero impostare le date di scadenza future per tutte le mie risorse statiche.

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

Grazie per tutto il tuo 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

Finalmente 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 

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 tuo secondo punto, se usi i metodi dell’helper delle rotaie come

 stylesheet_link_tag 

e lasciare le impostazioni predefinite sul server web, le risorse sono in genere memorizzate nella cache piuttosto bene.

Il modo più semplice sarebbe scrivere un middleware Rack, che modifica l’intestazione Cache-Control in base a una logica (ad esempio, solo per application / xml mime-type). Oppure, per un approccio più brutto, ma ancora funzionante, è ansible modificare la costante ActionDispatch :: Response :: DEFAULT_CACHE_CONTROL in “no-cache”. Naturalmente, se è richiesto il controllo e / o la granularità delle azioni, è meglio farlo nel controller.

Punto di nota: non è ansible cancellare la cache in modo condizionale (come se un before_filter chiama solo reset_cache se l’utente è già stato lì). È necessario cancellare incondizionatamente 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 che sono stati lì, dal momento che il browser utilizza le intestazioni cache originali sul pulsante Indietro.

 before_filter :reset_cache 

funzionerà, tuttavia (dopo aver aggiornato la pagina e svuotato la cache prima di averlo aggiunto, ovviamente), dal momento che, alla prima richiesta, il browser otterrà la no-cache, no-store, ... e lo applicherà al futuro caricamento della pagina.