【问题标题】:Overriding rails Cache-Control header on redirect重定向时覆盖 rails Cache-Control 标头
【发布时间】:2011-09-08 03:59:30
【问题描述】:

我是否:

head 302

head 307

redirect_to

在同一个控制器动作中调用

response.headers['Cache-Control'] = "public, max-age=86400"

没有效果。 Rails 发送:

Cache-Control: no-cache

无论如何。我需要发送 Cache-Control 标头来指示边缘缓存为重定向服务一天。这可能吗?

【问题讨论】:

  • 为什么要在重定向时提供缓存控制?
  • 因为重定向总是到同一个位置,但该位置存储在数据库中,我不希望我的 rails 应用程序必须在每个请求时查找它。我希望 cloudfront 进行重定向,而不必先去 rails。

标签: ruby-on-rails caching cdn amazon-cloudfront


【解决方案1】:

您不能直接将 Cache-Control 设置到标头中(现在?),因为您需要修改 response.cache_control 对象(因为稍后将使用它来设置 Cache-Control 标头)。

幸运的是,expires_in 方法会为您解决这个问题:

expires_in 1.day, :public => true

在此处查看更多信息: http://apidock.com/rails/ActionController/ConditionalGet/expires_in

【讨论】:

  • 非常感谢。你可以把它放在你的动作中,或者像我一样把它放在before_filter 中。就凭自己。
  • 不幸的是,这仍然没有为我解决问题,尽管我怀疑这是因为我处于开发模式。优步愚蠢的系统
【解决方案2】:

尝试改用这个

response.headers['Cache-Control'] = 'public, max-age=300'

并确保您处于生产模式。 Rails 不会在开发中缓存。

【讨论】:

  • 为什么降低最大年龄会有任何不同?
  • heroku 中的所有应用都在生产模式下运行,是的。
【解决方案3】:

使用 Rails 5 你可以做到

response.cache_control = 'public, max-age=86400'

【讨论】:

    【解决方案4】:
    . I need to send the Cache-Control header to instruct an edge cache to serve the redirect for a day.
    

    这怎么可能?在临时重定向的情况下,浏览器将始终尝试首先获取原始 url,然后在重定向时他们将尝试其他 url,如果缓存在代理上,则可以从那里提供服务。 但是再次浏览器仍然会与您的服务器进行首次联系。

    【讨论】:

    • 我希望 cloudfront 在从 URI 的来源收到重定向后提供重定向服务。文档说,如果在来自源的重定向响应中设置了 Cache-Control 标头,它将执行此操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 2015-04-13
    • 2011-06-13
    • 1970-01-01
    相关资源
    最近更新 更多