2012-03-29 60 views
4

我一直在试图获得在Heroku上的Rails 3.2的流式工作(请参阅我的SO帖子:Rails 3.2 streaming)。可以在Rails 3.2中的每个请求基础上禁用rack-cache?

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

我只希望它禁用的一个流请求(这是管理端,将不常使用)。这可能吗?为了一个小的(但是必需的)管理功能而丢失缓存将会是一个重大的失望。

非常感谢!

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

+0

真正帮助我解决这个问题的其实只是知道你可以使用'config.middleware.delete(“Rack :: Cache”)'来禁用Rack :: Cache。 (P.S .:它需要Rack :: Cache的引用。) – thekingoftruth 2013-09-25 17:17:41

回答

2

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

0

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

每源herehere,如果Cache-Control: no-cache头或Pragma: no-cache标头设置,机架::缓存将不会试图把从缓存中的请求。这并不会禁用它,但它确实可以确保您没有不应缓存的请求最终返回缓存响应。

此外,还可以确保机架::缓存,从不缓存为给定的行动类似的回应:在你的控制器动作

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

。这将确保Rack :: Cache(以及任何其他上游代理)不会缓存响应,从而使您的后端始终保持新鲜感。

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

+0

不幸的是,似乎设置头文件并不能解决它。似乎我需要完全取消Rack :: Cache。我会调查你的补丁的想法......任何指示我可能会这样做?谢谢! – 2012-03-29 22:14:02

+0

你应该放弃最大年龄。从RFC2616开始:如果请求包含no-cache指令,它不应该包含min-fresh,max-stale或max-age。 – zaius 2013-02-05 09:21:10

+0

RFC的那部分适用于请求标头,而不是响应标头。 – 2013-02-05 13:00:54

相关问题