如何防止在Rails中浏览器页面caching
Ubuntu – > Apache – > Phusion Passenger – > Rails 2.3
我的网站的主要部分反应到您的点击。 所以,如果你点击一个链接,它会把你发送到目的地,并立即重新生成你的页面。
但是,如果您点击后退button,则看不到新的页面。 不幸的是,没有手动刷新, 它似乎浏览器正在caching它。 我想确保浏览器不会caching页面。
另外,我确实希望为我所有的静态资产设置远期到期date。
什么是解决这个问题的最好方法? 我应该在Rails中解决这个问题吗? Apache的? JavaScript的?
谢谢你的帮助,Jason
唉。 这些build议都没有强迫我正在寻找的行为。
也许有一个JavaScript的答案? 我可以让rails在评论中写出一个时间戳,然后通过javascript检查来查看时间是否在五秒之内(或者其他什么)。 如果是,那么罚款,但如果没有,然后重新加载页面?
你认为这会起作用吗?
感谢你的帮助,
贾森
最后想出了这个 – 在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
使用:
expires_now()
http://api.rubyonrails.org/classes/ActionController/ConditionalGet.html#method-i-expires_now
我已经在控制器中使用了这一行,取得了一些成功。 它在Safari和Internet Explorer中工作,但我还没有看到它与Firefox的工作。
response.headers["Expires"] = "#{1.year.ago}"
对于你的第二点,如果你使用类似的帮助方法
stylesheet_link_tag
并保留您的networking服务器的默认设置,资产通常caching相当不错。
更简洁的方法是编写一个Rack中间件,它根据某些逻辑(例如,仅针对application / xml mime-type)更改Cache-Control标头。 或者,对于一个丑陋的,但仍然工作的方法,可以将ActionDispatch :: Response :: DEFAULT_CACHE_CONTROL常量改为“no-cache”。 当然,如果需要控制器和/或动作粒度,那么最好在控制器中这样做。
值得注意的是:你不能有条件地清除caching(就像before_filter
只在用户已经在那里时才调用reset_cache
)。 您需要无条件地清除caching,因为浏览器不会仅仅为了查看是否需要重新加载新的请求,即使它不需要上一次。
例:
before_filter :reset_cache, if: :user_completed_demographics?
因为浏览器使用“返回”button上的原始caching标题,所以无法阻止用户返回后返回。
before_filter :reset_cache
将会工作,但是(在刷新页面之后清除caching之前,显然是这样),因为在第一次请求时,浏览器将获得no-cache, no-store, ...
并将其应用于未来页面加载。