如果我这样做:
的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被浏览器缓存。
我的目标是:
以上代码是否会实现此目的。 (我的初步测试是这样的)
答案 0 :(得分:2)
不,浏览器不会缓存服务器端重定向。
答案 1 :(得分:2)
不幸的是,你无法100%确定不会缓存响应:(
原因是您根本无法控制响应所在的所有计算机。在此过程中可能存在配置错误的代理,甚至是不应该缓存响应的客户端。
您唯一能做的就是创建一个很有可能不被缓存的响应。
因此我建议您使用307(临时重定向)状态代码进行重定向。它声明响应应该不被缓存(除非Cache-Control
或Expires
标题指定)。
其他选项包括:
根据规范,不需要缓存控制头。据我所知,所有主流浏览器和代理都正确遵循307的规范。
但是,如果您可能会遇到默认缓存的客户端,请添加以下标头:
Cache-Control: no-cache, no-store, must-revalidate
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Pragma: no-cache
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时,用户仍然可以获得有关可以找到资源的位置的信息。