如何进行非缓存301重定向?

时间:2012-08-30 08:12:55

标签: php http redirect http-status-code-301

前段时间所有浏览器都改变了行为并开始缓存301重定向,我想知道如何在php中进行301重定向缓存?

3 个答案:

答案 0 :(得分:25)

301 永久重定向,因此缓存很有意义。如果您的重定向不是永久性的,请使用 307 (临时重定向), 302 (找到)或 303 (请参阅其他)。

See here了解相应的用例。

详细说明这三者之间的差异:

  • 307 是资源移动时的通用临时重定向。例如,像domain.com/news/latest这样的网址可能会重定向到最新的新闻文章domain.com/news/article-594873。由于此临时重定向可能持续一段时间(特定文章可能是几个小时内的最新文章),因此浏览器可能缓存重定向。要控制它们的工作程度,请使用缓存控制标题。
  • 303 永远无法缓存的重定向。例如,将新文章发布到domain.com/news可能会创建新的新闻文章,并向domain.com/news/article-978523提供303重定向。由于另一个 POST请求会导致创建一个完全不同的新文章,因此无法对其进行缓存。
  • 302 有点陌生,我自己从未使用过它。显然它更像是303的遗留替代品,对于那些不了解303的早期HTTP 1.0版客户来说。

因为您具体询问了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;

答案 1 :(得分: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而不会导致无限循环或其他废话时,仍然能够跟踪它们或撤消重定向时,这非常有用。

这绝不意味着301代码必须用于所有重定向,相反,不同类型的重定向具有不同的status codes Core Xii总结。

答案 2 :(得分:1)

核心Xii的答案是正确的。

然而,除此之外,您还可以使用Firefox / Chrome开发者工具插件来清除重定向和DNS缓存。