如何防止Rails中的浏览器页面缓存

时间:2009-04-02 20:13:36

标签: ruby-on-rails ruby apache caching http-headers

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

我网站的主要部分会对您的点击做出反应。因此,如果您点击链接,它会将您发送到目的地,并立即重新生成您的页面。

但是,如果您点击后退按钮,则看不到新页面。不幸的是,如果没有手动刷新,它就不会出现;看来浏览器正在缓存它。我想确保浏览器不缓存页面。

另外,我想要为我的所有静态资产设置远期到期日期。

解决这个问题的最佳方法是什么?我应该在Rails中解决这个问题吗? Apache的?的Javascript?

感谢您的帮助, 杰森


唉。这些建议都没有强迫我正在寻找的行为。

也许有一个javascript答案?我可以让rails在注释中写出时间戳,然后让javascript检查以查看时间是否在五秒钟内(或者无论什么工作)。如果是,那么很好,但如果没有,那么重新加载页面?

你觉得这会起作用吗?

感谢您的帮助,

杰森

6 个答案:

答案 0 :(得分:321)

最后在application_controller.rb

中找出了这一点 - http://blog.serendeputy.com/posts/how-to-prevent-browsers-from-caching-a-page-in-rails/
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

答案 1 :(得分:14)

答案 2 :(得分:3)

我在控制器中使用了这条线并取得了一些成功。它适用于Safari和Internet Explorer,但我还没有看到它适用于Firefox。

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

关于第二点,如果你使用rails辅助方法,比如

stylesheet_link_tag

并保留网络服务器上的默认设置,资产通常可以很好地缓存。

答案 3 :(得分:1)

更简洁的方法是编写一个Rack中间件,它根据某些逻辑更改Cache-Control标头(例如,仅用于application / xml mime-type)。 或者,对于一个更丑陋但仍在工作的方法,可以将ActionDispatch :: Response :: DEFAULT_CACHE_CONTROL常量更改为“no-cache”。 当然,如果需要控制器和/或操作粒度,那么最好在控制器中执行此操作。

答案 4 :(得分:1)

注意事项:您无法有条件地清除缓存(例如before_filter只有在用户已经在那里时才调用reset_cache。您需要无条件地清除缓存,因为浏览器不会发出新请求只是为了查看是否需要重新加载,即使它不需要持续时间。

示例:

before_filter :reset_cache, if: :user_completed_demographics?
由于浏览器使用“返回”按钮上的原始缓存标题,

无法阻止用户在他们访问后再回来。

before_filter :reset_cache

会起作用(在刷新页面并清除缓存之前,显然是在添加之前),因为在第一次请求时,浏览器将获得no-cache, no-store, ...并将其应用于将来的页面加载。

答案 5 :(得分:0)

no_cache_control Gem.

如果您需要对所有回复执行此操作,例如要通过渗透测试(BURP,Defectify等),您可以在Rails 4+上安装此Gem,以便将以下标头添加到所有响应中:

Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: -1

工作就像一种魅力,实际上是正确的方法,可用于需要身份验证才能执行任何操作的安全HTTPS Web应用程序。