一段时间以前,所有浏览器都改变了它们的行为并开始缓存301重定向,我想知道如何在PHP中实现不被缓存的301重定向?
一段时间以前,所有浏览器都改变了它们的行为并开始缓存301重定向,我想知道如何在PHP中实现不被缓存的301重定向?
301是一种永久性重定向,因此缓存是有意义的。如果您的重定向不是永久性的,请使用307(临时重定向)、302(找到)或303(查看其他)。
在此处查看适当的用例。
对于这三者之间的区别作进一步说明:
domain.com/news/latest
这样的 URL 可能会对最新的新闻文章进行 307 重定向,指向domain.com/news/article-594873
。由于该暂时重定向可能存在一段时间(该特定文章可能会是最新的几个小时),浏览器可能会缓存重定向。要控制缓存程度,请使用缓存控制头。domain.com/news
,可能会创建一个新的新闻文章,并提供到domain.com/news/article-978523
的 303 重定向。由于另一个POST请求会导致创建完全不同的新文章,因此不能缓存。由于您特别询问了 PHP:
<?php
function header_redirect_permanent($url)
{
header($_SERVER['SERVER_PROTOCOL'] . ' 301 Moved Permanently', true, 301);
header('Location: ' . $url);
}
function header_no_cache()
{
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // past date to encourage expiring immediately
}
如果必须的话,您可以使用上述缓存控制头来防止代理缓存301,方法如下:
header_no_cache();
header_redirect_permanent($url);
或者简单地添加
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');
header('Location:'.$url, true, 301);
exit;
没有缓存的http状态码301可以用于URL规范化,同时保留跟踪功能。
为了防止301重定向被缓存,请设置缓存控制头,然后您可以撤消重定向,客户端(机器人和浏览器)将不会再被重定向。
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');
header('Location:'.$url, true, 301);
exit;
当您希望浏览器更新书签中的URL和机器人更新索引,但仍能够跟踪它们或通过将重定向返回到原始URL而不会导致无限循环或其他荒谬行为时,这非常有用。