【问题标题】:Possible to disable rack-cache on a per-request basis in Rails 3.2?可以在 Rails 3.2 中按请求禁用 rack-cache 吗?
【发布时间】:2012-04-13 09:44:44
【问题描述】:

我一直在尝试在 Heroku 上的 Rails 3.2 中进行流式处理(请参阅我的 SO 帖子:Rails 3.2 streaming)。

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

我只想为一个流式传输请求禁用它(它在管理端并且不经常使用)。这可能吗?为了一个小的(但必需的)管理功能而丢失缓存将是一个很大的麻烦。

非常感谢!!!

编辑:我已尝试将标头设置为不缓存相关操作,但 Rack::Cache 仍然导致流式传输失败。完全禁用它是我迄今为止找到的唯一解决方案。

【问题讨论】:

  • 在这个问题上真正帮助我的是知道你可以使用 config.middleware.delete("Rack::Cache") 禁用 Rack::Cache。 (P.S.:它需要在 Rack::Cache 周围加上引号。)

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    根据源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(和任何其他上游代理)不会缓存响应,从而导致对您的后端的始终是新的命中。

    如果这失败了,那么您可能会因为 context.rb 中的 forward 方法而遇到问题。似乎没有办法绕过它,因此如果设置了某个标头,您可能需要修补 Rack::Cache 以仅调用 #call

    【讨论】:

    • 不幸的是,似乎设置标题并不能解决它。似乎我需要完全摆脱 Rack::Cache 的影响。我会调查你的补丁想法......关于我如何做到这一点的任何指示?谢谢!
    • 你应该放弃最大年龄。来自 RFC2616:如果请求包含 no-cache 指令,则不应包含 min-fresh、max-stale 或 max-age。
    • RFC 的那部分适用于请求标头,而不是响应标头。
    猜你喜欢
    • 2012-06-05
    • 2012-10-20
    • 2013-02-19
    • 2010-12-11
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 2012-04-04
    相关资源
    最近更新 更多