【问题标题】:How long is a 302 redirect saved in browser?302 重定向在浏览器中保存多长时间?
【发布时间】:2012-08-26 02:58:07
【问题描述】:

由于我们的网络服务器配置错误,主域向新位置发送了 302 重定向。我们解决了这个问题。现在清空浏览器缓存一切正常。

对于不清空缓存的“普通”客户端:302 重定向在浏览器中保留多长时间?

我正在寻找默认设置下每个主要浏览器(Chrome、Firefox、Safari、Opera、Edge、IE 12)的特定缓存时间(如果有)。

【问题讨论】:

标签: redirect browser browser-cache cache-control http-status-code-302


【解决方案1】:

这取决于个别客户端的浏览器缓存设置:IE 有一个“从不”检查新页面的选项,它对重定向具有相同的效果。
而且 AFAIR IE 的“自动”设置(默认?)也好不了多少。

【讨论】:

    【解决方案2】:

    除非 Web 服务器还返回了 Cache-Control 或 Expires 标头,否则它根本不应该被缓存。根据RFC 2616, section 10.3.3 302 Found

    请求的资源暂时位于不同的 URI 下。由于重定向有时可能会改变,客户端应该继续使用 Request-URI 来处理未来的请求。此响应仅在由 Cache-Control 或 Expires 标头字段指示时才可缓存。

    【讨论】:

    • 谢谢。看起来我的默认测试浏览器(Chrome)只是在这件事上愚弄了我:code.google.com/p/chromium/issues/detail?id=103458(Chrome 缓存,其他没有)
    • @OleAlbers 我正准备用注释(在我的互联网死机之前)编辑我的答案,虽然 RFC 说客户端 应该 继续使用原始 URI,但它并不意味着所有浏览器都可以,这需要根据具体情况来考虑。
    【解决方案3】:

    Jon Lin 在这里引用的标准使用“应该”,在 RFC 术语中是 not as strong as "MUST"。这不仅仅是一个理论上的分歧。以 Cloudflare 为例,does cache redirects:

    如果没有提供缓存头(没有 Cache-Control 或 Expires)并且 url 是可缓存的(.jpg、.css、.js 等)然后 CloudFlare 缓存两者 301 和 302s。我们将 301 缓存几个小时,将 302 缓存一个 更短的时间(约 20 分钟)。

    因此,您应该确保可以处理它或使用显式标头(例如Cache-Control: private, no-cache)来指导浏览器和中间体反对缓存它。

    【讨论】:

    • 是的,这对我来说是个问题——没有指定 Cache-Control 会导致缓存重定向。可以查看此线程,以更全面地了解指定无缓存标头:stackoverflow.com/questions/49547/…
    【解决方案4】:

    火狐

    它不应该被缓存,每个bug 812167

    【讨论】:

      【解决方案5】:

      使用 Steve Sounder 的 Redirect Caching Tests tool(感谢 @LeonidVasilev),似乎结果可能不是预期的。没有 expires 标头或 cookie,结果如下:

      Chrome 71:未缓存 ✔
      Firefox 64:已缓存 ✕
      Safari 12:已缓存 ✕

      因此,尽管 RFC 2616, section 10.3.3 302 Found 声明了什么,但并非所有浏览器都遵循这些准则或可能被视为预期行为:(

      【讨论】:

        【解决方案6】:

        添加

        Cache-Control: no-store
        

        响应的标头,它不会被缓存。截至 2020 年 7 月 20 日,所有主流浏览器都尊重这一点。

        但要注意中间缓存(代理/CDN):如果中间人的最小 TTL 不为零,那么无论您做什么,您的响应都会被缓存。例如:

        Managing How Long Content Stays in an Edge Cache (Expiration)

        表格的最后一行(Origin 将 Cache-Control: no-cache、no-store 和/或私有指令添加到对象)。在这种情况下,防止缓存的唯一方法是将 TTL 设置为 0(当然还要添加 Cache-Control: no-store 标头)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-12-27
          • 2016-01-27
          • 2012-02-26
          • 1970-01-01
          • 1970-01-01
          • 2017-08-07
          • 1970-01-01
          相关资源
          最近更新 更多