Php 服务器端头重定向是否缓存?

Php 服务器端头重定向是否缓存?,php,redirect,Php,Redirect,如果我这样做: 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); ?> 然后用没有标题重定向的新内容替换i

如果我这样做:

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重定向,才能使其不被浏览器缓存。请参阅:

我还添加了缓存控制头,以防止在浏览器缓存307时进行缓存

我的目标是:

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

上面的代码能完成这一点吗?(我的初始测试看起来是这样的)

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

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

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

您唯一能做的就是创建一个不被缓存的概率非常高的响应

状态码 因此,我建议您使用307(临时重定向)状态代码进行重定向。它指出不应缓存响应(除非
缓存控制
过期
标题指定)

其他选择包括:

  • 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进行总结 离题
请注意,明智的做法是在响应主体中包含一个带有指向新位置链接的小文本(除非请求方法是
HEAD
)。这样可以确保当客户端不支持HTTP/1.1时,用户仍然可以获得有关资源位置的一些信息。

您在该响应中发送了哪些缓存控制头?我不发送任何缓存控制头。我试图实现的目标是,仅当我在执行应用程序更新时才在那里重定向。然后,当应用程序运行到我希望重定向消失的日期。我不希望以任何方式缓存它,它需要在推送代码时立即工作,然后当我删除代码时,它不能缓存。好的,取决于缓存控制。对我来说,它听起来像307不会被缓存。你认为我应该放头以防万一吗?这些头是什么?“使用任何其他状态代码(例如状态代码302和307)接收的响应不得在对后续请求的答复中返回,除非存在缓存控制指令或明确允许它的其他标头。例如,这些标头包括以下内容:Expires标头(第14.21节);“max age”、“s-maxage”,“必须-重新验证”、“代理重新验证”、“公共”或“私有”缓存控制指令(第14.9节)。”
header('HTTP/1.1 307 Temporary Redirect');
header('Location: http://apple.com', true, 307);
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Expires: Thu, 01 Jan 1970 00:00:00 GMT');
header('Pragma: no-cache');