可以在Rails 3.2中基于每个请求禁用机架缓存吗?

时间:2012-03-29 17:41:44

标签: ruby-on-rails ruby caching streaming rack

我一直试图在Heroku上使用Rails 3.2进行流媒体工作(请参阅我的帖子:Rails 3.2 streaming)。

我得出的结论是,机架缓存导致了这个问题。在production.rb中使用config.middleware.delete(Rack::Cache)禁用它似乎可以解决它。显然,这会为我的整个应用禁用它。

我只希望它禁用一个流式传输请求(在管理端,并且不经常使用)。这可能吗?为了一个小的(但需要的)管理功能而失去缓存是一个很大的失败。

非常感谢!!!

编辑:我试图将标题设置为不缓存有问题的操作,但Rack :: Cache仍然导致流失败。完全禁用它是迄今为止我找到的唯一解决方案。

2 个答案:

答案 0 :(得分:2)

我最终不需要禁用Rack-cache。只需要将此self.response.headers['Last-Modified'] = Time.now.ctime.to_s 添加到我的回复中。

答案 1 :(得分:1)

虽然您无法禁用它,但您可能不需要;你可能只需要绕过缓存机制。

根据来源herehere,如果设置了Cache-Control: no-cache标头或Pragma: no-cache标头,则Rack :: Cache不会尝试从中提取请求缓存。这不会禁用它,但它确实让您确保没有不应该缓存的请求最终返回缓存响应。

此外,您可以确保Rack :: Cache永远不会缓存给定操作的响应,例如:

response.headers['Cache-Control'] = 'private,max-age=0,must-revalidate,no-store'

在您的控制器操作中。这将确保Rack :: Cache(以及任何其他上游代理)不会缓存响应,从而导致后端始终受到新的攻击。<​​/ p>

如果失败,那么由于context.rb中的forward方法,您可能会遇到问题。似乎没有办法绕过它,所以如果设置了某个标头,你可能想要修补Rack :: Cache只调用#call