【问题标题】:Are server side header redirects cached?是否缓存了服务器端标头重定向?
【发布时间】:2014-05-16 16:50:32
【问题描述】:

如果我这样做:

index.php

<?php
header('Cache-Control: no-cache, no-store, must-revalidate'); // HTTP 1.1.
header('Pragma: no-cache'); // HTTP 1.0.
header('Expires: 0'); // Proxies.
header("Location: http://apple.com",TRUE,307);
?>

然后将 index.php 替换为没有标头重定向的新内容,浏览器是否可能缓存标头重定向?我知道客户端重定向可能会发生这种情况,但我不确定服务器端重定向是否会发生这种情况。 (它似乎不是基于我的测试,但我想确定一下。

编辑:

看起来我需要进行 307 重定向才能使其不被浏览器缓存。见:http://www.php.net/manual/en/function.header.php#78470

我还添加了缓存控制标头以防止缓存,以防 307 被浏览器缓存。

我的目标是:

  • 不应缓存页面。删除标头位置重定向后,不应以任何方式对其进行重定向。

上面的代码能做到这一点吗? (我最初的测试是这样的)

【问题讨论】:

  • 您在该响应中发送了哪些缓存控制标头?
  • 我没有发送任何东西。我试图完成的目标是只有在我进行应用程序更新时有一个重定向。然后,当应用程序是最新的时,我希望重定向消失。我不希望它以任何方式缓存,它需要在推送代码时立即工作,然后当我删除代码时它不能缓存。
  • 嗯,response cacheability 取决于缓存控制。
  • 对我来说听起来 307 不会被缓存。你认为我应该放标题以防万一吗?这些标头是什么?
  • “收到的响应带有任何其他状态码(例如状态码 302 和 307)不得在对后续请求的回复中返回除非有缓存控制指令或其他标头( s) 明确允许它。例如,这些包括以下内容: Expires 标头(第 14.21 节); “max-age”、“s-maxage”、“must-revalidate”、“proxy-revalidate”、“public”或“private”缓存控制指令(第 14.9 节)。”

标签: php redirect


【解决方案1】:

不,浏览器不会缓存服务器端重定向。

【讨论】:

    【解决方案2】:

    ###防止缓存###

    不幸的是,您无法 100% 确定响应不会被缓存:(

    原因是您根本无法控制响应传播的所有机器。一路上可能存在配置不当的代理,甚至客户端会​​在不应该缓存响应时缓存响应。

    您唯一能做的就是创建一个很有可能不被缓存的响应。

    ###状态码###

    因此,我建议您使用 307(临时重定向)状态代码进行重定向。它指出响应应该被缓存(除非由Cache-ControlExpires 标头指定)。

    其他选项有:

    • 303(参见其他),但它允许缓存第二个请求(重定向后)的响应。
    • 302(已找到),但有(相对较多)客户端已将其实现为 303。

    ###缓存控制头###

    根据规范,缓存控制标头不是必需的。据我所知,所有主流浏览器和代理都正确遵循了 307 规范。

    但以防万一您遇到默认缓存的客户端,请添加以下标头:

    Cache-Control: no-cache, no-store, must-revalidate
    Expires: Thu, 01 Jan 1970 00:00:00 GMT
    Pragma: no-cache
    

    ###PHP总结###

    header('HTTP/1.1 307 Temporary Redirect');
    header('Cache-Control: no-cache, no-store, must-revalidate');
    header('Expires: Thu, 01 Jan 1970 00:00:00 GMT');
    header('Pragma: no-cache');
    header('Location: http://apple.com', true, 307);
    

    ###题外话###

    请注意,在响应正文中包含一个带有指向新位置的链接的小文本是明智的(除非请求方法是HEAD)。这样可以确保当客户端不支持 HTTP/1.1 时,用户仍然可以获得有关资源所在位置的一些信息。

    【讨论】:

      猜你喜欢
      • 2021-10-18
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      • 2016-10-12
      • 2015-11-04
      • 1970-01-01
      • 2016-02-14
      • 2021-12-30
      相关资源
      最近更新 更多