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

时间:2014-04-04 11:33:45

标签: 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);
?>

然后将index.php替换为没有标题重定向的新内容,浏览器是否可以缓存标题重定向?我知道这可能发生在客户端重定向,但我不确定它是否会发生在服务器端重定向。 (根据我的测试,它似乎并不合适,但我想确定。

编辑:

看起来我需要对它进行307重定向,以免被浏览器缓存。请参阅:http://www.php.net/manual/en/function.header.php#78470

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

我的目标是:

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

以上代码是否会实现此目的。 (我的初步测试是这样的)

2 个答案:

答案 0 :(得分:2)

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

答案 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('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');

题外话

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