with rails memcache development cache ruby-on-rails ruby apache caching http-headers

ruby-on-rails - memcache - rails etag



Cómo evitar el almacenamiento en caché de la página del navegador en Rails (5)

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

La parte principal de mi sitio reacciona a tus 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, 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 tu ayuda, Jason

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

Tal vez hay una respuesta de 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 tu ayuda,

Jason


He usado 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 usa los métodos de los carriles auxiliares como

stylesheet_link_tag

y deje la configuración predeterminada en su servidor web, los activos suelen almacenarse en caché bastante bien.


La manera más limpia sería escribir un middleware de Rack, que cambia el encabezado de Cache-Control basado en cierta lógica (por ejemplo, solo para application / xml mime-type). O bien, para un enfoque más feo pero aún en funcionamiento, se podría cambiar la constante ActionDispatch :: Response :: DEFAULT_CACHE_CONTROL a ''no-cache''. Por supuesto, si se requiere la granularidad del controlador y / o de la acción, entonces es mejor hacerlo en el controlador.


Punto de referencia: no se puede borrar el caché de forma condicional (como si un before_filter solo llama a reset_cache si el usuario ya ha estado allí). Debe borrar incondicionalmente el caché, ya que el navegador no realizará una nueva solicitud solo para ver si esta vez, debe volver a cargarse, aunque no necesitó la última vez.

Ejemplo:

before_filter :reset_cache, if: :user_completed_demographics?

no funcionará para evitar que los usuarios regresen después de haber estado allí, ya que el navegador usa los encabezados de la memoria caché original en el botón Atrás.

before_filter :reset_cache

funcionará, sin embargo (después de actualizar la página y borrar la caché de antes de agregar esto, obviamente), ya que, en la primera solicitud, el navegador obtendrá el no-cache, no-store, ... y lo aplicará a futuros carga de página.