Cómo evitar el almacenamiento en caché de páginas del navegador en Rails


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á instantáneamente su página.

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

Por separado, yo quiero establecer fechas de vencimiento de 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


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

Tal vez hay una respuesta de javascript? Podría hacer que rails escriba una marca de tiempo en un comentario, luego hacer que javascript revise para ver si los tiempos están dentro de cinco segundos (o lo que funcione). En caso afirmativo, entonces bien, pero si no, entonces volver a cargar la página?

¿Crees que esto funcionaría?

Gracias por toda su ayuda,

Jason

Author: Lasse Vågsæther Karlsen, 2009-04-03

5 answers

Finalmente se dio cuenta de esto - 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
 314
Author: Jason Butler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-01 02:29:24
 14
Author: Sacre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-05 09:57:35

He usado esta línea con cierto éxito en el controlador. Funciona en Safari e Internet Explorer, pero no he visto que funcione con Firefox.

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

Para su segundo punto, si utiliza los métodos auxiliares de rails como

stylesheet_link_tag

Y deje la configuración predeterminada en su servidor web, los activos generalmente se almacenan en caché bastante bien.

 3
Author: erik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-02 21:29:04

La forma más limpia sería escribir un middleware Rack, que cambia el encabezado de Control de caché basado en alguna lógica (por ejemplo, solo para el tipo mime application/xml). O, para un enfoque más feo, pero aún funcionando, uno 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 hacerlo en el controlador.

 1
Author: Roman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-07 20:03:14

Nota: No se puede borrar condicionalmente la caché (como si un before_filter solo llama a reset_cache si el usuario ya ha estado allí). Necesitas incondicionalmente borrar la caché, porque el navegador no hará una nueva solicitud solo para ver si esta vez, necesita recargar, 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 utiliza los encabezados de caché originales en la parte posterior botón.

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 futuras cargas de página.

 1
Author: BalinKingOfMoria,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-20 17:25:34