前段时间所有浏览器都改变了他们的行为并开始缓存 301 重定向,我想知道如何做一个没有缓存在 php 中的 301 重定向?
问问题
16467 次
2 回答
33
301是永久重定向,因此缓存是有意义的。如果您的重定向不是永久性的,请使用307(临时重定向)、302(找到)或303(参见其他)。
详细说明这三者之间的区别:
- 307是移动资源时的通用临时重定向。例如,像这样的 URL
domain.com/news/latest
可能会执行 307 重定向到最新的新闻文章,domain.com/news/article-594873
. 由于这种临时重定向可能会持续一段时间(该特定文章可能是最新的几个小时),浏览器可能会缓存重定向。要控制它们执行的程度,请使用缓存控制标头。 - 303是永远不能缓存的重定向。例如,将一篇新文章发布到
domain.com/news
可能会创建一篇新的新闻文章,并提供到它的 303 重定向到domain.com/news/article-978523
. 由于另一个POST 请求会导致创建完全不同的新文章,因此无法缓存它。 - 302有点陌生,我自己没用过。显然,对于不理解 303 的早期 HTTP 1.0 版本的客户端来说,它更像是 303 的传统替代品。
既然您专门询问了 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;
于 2012-08-30T08:18:05.133 回答
5
没有缓存的 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 来撤消重定向而不会导致无限循环或其他废话时,这很有用。
于 2013-09-25T11:10:39.487 回答