代码之家  ›  专栏  ›  技术社区  ›  Timo Huovinen

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

  •  12
  • Timo Huovinen  · 技术社区  · 12 年前

    不久前,所有浏览器都改变了它们的行为,并开始缓存301重定向,我想知道如何进行未缓存在php中的301重定向?

    2 回复  |  直到 11 年前
        1
  •  35
  •   Timo Huovinen    8 年前

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

    See here 用于适当的用例。

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

    • 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的早期HTTP1.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;
    
        2
  •  5
  •   Community CDub    7 年前

    没有缓存的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 总结。