11

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

4

2 回答 2

33

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

有关适当的用例,请参见此处

详细说明这三者之间的区别:

  • 307是移动资源时的通用临时重定向。例如,像这样的 URLdomain.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 来撤消重定向而不会导致无限循环或其他废话时,这很有用。

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

于 2013-09-25T11:10:39.487 回答