Ubuntu - > Apache - > Phusion Passenger - > Rails 2.3
我网站的主要部分会对您的点击做出反应。因此,如果您点击链接,它会将您发送到目的地,并立即重新生成您的页面。
但是,如果您点击后退按钮,则看不到新页面。不幸的是,如果没有手动刷新,它就不会出现;看来浏览器正在缓存它。我想确保浏览器不缓存页面。
另外,我做想要为我的所有静态资产设置远期到期日期。
解决这个问题的最佳方法是什么?我应该在Rails中解决这个问题吗? Apache的?的Javascript?
感谢您的帮助, 杰森
唉。这些建议都没有强迫我正在寻找的行为。
也许有一个javascript答案?我可以让rails在注释中写出时间戳,然后让javascript检查以查看时间是否在五秒钟内(或者无论什么工作)。如果是,那么很好,但如果没有,那么重新加载页面?
你觉得这会起作用吗?
感谢您的帮助,
杰森
答案 0 :(得分:321)
最后在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
答案 1 :(得分:14)
使用:
expires_now()
http://api.rubyonrails.org/classes/ActionController/ConditionalGet.html#method-i-expires_now
答案 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应用程序。