我一直试图在Heroku上使用Rails 3.2进行流媒体工作(请参阅我的帖子:Rails 3.2 streaming)。
我得出的结论是,机架缓存导致了这个问题。在production.rb中使用config.middleware.delete(Rack::Cache)
禁用它似乎可以解决它。显然,这会为我的整个应用禁用它。
我只希望它禁用一个流式传输请求(在管理端,并且不经常使用)。这可能吗?为了一个小的(但需要的)管理功能而失去缓存是一个很大的失败。
非常感谢!!!
编辑:我试图将标题设置为不缓存有问题的操作,但Rack :: Cache仍然导致流失败。完全禁用它是迄今为止我找到的唯一解决方案。
答案 0 :(得分:2)
我最终不需要禁用Rack-cache。只需要将此self.response.headers['Last-Modified'] = Time.now.ctime.to_s
添加到我的回复中。
答案 1 :(得分:1)
虽然您无法禁用它,但您可能不需要;你可能只需要绕过缓存机制。
根据来源here和here,如果设置了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
。