2009-04-02 10 views
138

Ubuntu -> Apache -> Phusion de pasajeros -> Barras de 2.3Cómo prevenir la página del navegador de almacenamiento en caché en Rails

La parte principal de mi sitio web reacciona a los clics. Por lo tanto, si hace clic en un enlace, lo enviará al destino y regenerará su página al instante.

Pero, si presiona el botón Atrás, no verá la página nueva. Lamentablemente, no se muestra sin una actualización manual; parece que el navegador lo está almacenando en la memoria caché. Quiero asegurarme de que el navegador no almacena en caché la página.

Por separado, I do quiero establecer fechas de vencimiento para el futuro lejano para todos mis activos estáticos.

¿Cuál es la mejor manera de resolver esto? ¿Debo resolver esto en Rails? ¿Apache? Javascript?

Gracias por toda su ayuda, Jason


Alas. Ninguna de estas sugerencias forzó el comportamiento que estoy buscando.

Quizás haya una respuesta en javascript? Podría hacer que los rieles escriban una marca de tiempo en un comentario, luego haga que javascript compruebe si los tiempos están dentro de los cinco segundos (o lo que sea que funcione). Si es así, entonces está bien, pero si no, ¿entonces vuelve a cargar la página?

¿Crees que esto funcionaría?

Gracias por toda su ayuda,

Jason

Respuesta

305

Finalmente dado cuenta de esto - http://blog.serendeputy.com/posts/how-to-prevent-browsers-from-caching-a-page-in-rails/ en 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

Gracias ... ¡me salvó un montón de tiempo! – mikeymo

+0

Después de dos días de búsqueda, finalmente encontré esta respuesta. Gracias a un millón ^^ – StefanS

+1

Solo necesito agregar al coro y decir gracias (!!!) por esta respuesta. He tenido este problema durante * demasiado tiempo *. –

3

he utilizado esta línea con cierto éxito en el controlador. Funciona en Safari e Internet Explorer pero no lo he visto funcionar con Firefox.

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

Para su segundo punto, si utiliza los métodos de ayuda al igual que los carriles

stylesheet_link_tag 

y dejar la configuración predeterminada en su servidor web, los activos se almacenan en caché normalmente bastante bien.

+3

'1.year.ago' es una sobrecarga innecesaria. Solo escoja alguna hora arbitraria en el pasado como 'Vie, 01 Ene 1990 00:00:00 GMT' – Archonic

1

La forma más limpia sería escribir un middleware Rack, lo que cambia la cabecera Cache-Control basado en una lógica (por ejemplo, sólo para la aplicación/xml tipo MIME). O, para un enfoque más feo, pero que aún funciona, se podría cambiar la constante ActionDispatch :: Response :: DEFAULT_CACHE_CONTROL a 'no-cache'. Por supuesto, si se requiere el controlador y/o la granularidad de la acción, entonces es mejor hacer esto en el controlador.

13
+2

Esto no funcionó para mí en Chrome 21.0.1180.57. – Akrikos

+1

'expires_now' solo envía el encabezado' no-cache'. Dependiendo del navegador esto puede no ser suficiente. (Por ejemplo, Firefox quiere un 'no-store' para conexiones que no sean HTTPS: https://developer.mozilla.org/en/docs/Using_Firefox_1.5_caching) –

+1

¡Esto no funciona! – rardoz

0

Punto de nota: No se puede condicionalmente Borrar la caché (como si un before_filterreset_cache sólo llamadas de si el usuario ya ha estado allí).Necesita incondicionalmente borrar la caché, porque el navegador no hará una nueva solicitud solo para ver si esta vez, necesita volver a cargar, aunque no necesitó la última vez.

Ejemplo:

before_filter :reset_cache, if: :user_completed_demographics? 

no va a funcionar para evitar que los usuarios regresando después de haber estado allí, ya que el navegador utiliza las cabeceras de caché originales en el botón Volver.

before_filter :reset_cache 

va a funcionar, sin embargo (después de actualizar la página y borrar la memoria caché de antes de agregar esto, obviamente), ya que, en la primera solicitud, el navegador recibirá la no-cache, no-store, ... y aplicarlo a las futuras cargas de la página.

Cuestiones relacionadas