Tim*_*nen 9 php redirect http http-status-code-301
前一段时间所有的浏览器都改变了他们的行为并开始缓存301重定向,我想知道如何做一个没有缓存在php中的301重定向?
Cor*_*Xii 26
301是永久重定向,因此缓存是有意义的.如果您的重定向不是永久性的,请使用307(临时重定向),302(找到)或303(请参阅其他).
请参阅此处了解相应的用例.
详细说明这三者之间的差异:
domain.com/news/latest可能会执行307重定向到最新的新闻文章,domain.com/news/article-594873.由于此临时重定向可能会持续一段时间(特定文章可能是几个小时内的最新文章),因此浏览器可能会缓存重定向.要控制它们的工作程度,请使用缓存控制标头.domain.com/news可能会创建新的新闻文章,并提供303重定向到它domain.com/news/article-978523.由于另一个 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
}
Run Code Online (Sandbox Code Playgroud)
如果必须,您也可以使用上述缓存控制标头阻止代理缓存301:
header_no_cache();
header_redirect_permanent($url);
Run Code Online (Sandbox Code Playgroud)
或者只是添加
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;
Run Code Online (Sandbox Code Playgroud)
没有高速缓存的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;
Run Code Online (Sandbox Code Playgroud)
当您希望浏览器更新书签和漫游器中的URL以更新其索引但仍能够通过重定向回原始URL而不会导致无限循环或其他废话时,它仍然能够跟踪它们或撤消重定向.
这不以任何方式意味着301代码必须被用于所有重定向,相反,不同种类的重定向有不同的状态码,其核心十二总结.