【问题标题】:best way redirect/reload pages in PHP在 PHP 中重定向/重新加载页面的最佳方式
【发布时间】:2010-12-07 00:24:30
【问题描述】:

在 PHP 中重新加载/重定向页面以完全删除所有历史记录/缓存的最佳方法是什么?我应该使用哪些标头?

会发生什么:

单击链接时,会设置获取参数并执行脚本。完成后,我想在没有获取参数的情况下重定向并重新加载页面。一开始好像什么都没发生,但是当按下 F5 时,变化就出现了。

我想要什么:

重定向并重新加载,以便在不按 F5 的情况下显示更改。

【问题讨论】:

  • 您需要更具体。你不想在历史上出现哪一页?您正在呼叫的那个,还是您要重定向到的那个?缓存也是如此。

标签: php redirect reload


【解决方案1】:
<?php
header('Cache-Control: no-store, private, no-cache, must-revalidate');     // HTTP/1.1
header('Cache-Control: pre-check=0, post-check=0, max-age=0, max-stale = 0', false);  // HTTP/1.1
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');                  // Date in the past  
header('Expires: 0', false); 
header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');
header ('Pragma: no-cache');
header("Location: https://example.com", true, 302);
exit();
?>

【讨论】:

  • 虽然这段代码可能会解决问题,但一个好的答案还应该解释代码的什么以及它如何提供帮助。
【解决方案2】:

仅供参考,与 SEO 相关:

301 会告诉搜索引擎在他们的索引中替换 url。因此,如果 url1 使用 301 重定向到 url2,所有主要搜索引擎 [google, yahoo + bing] 都会将 url1 替换为 url2。

302 以不同的方式工作。它说该网址位于其他地址中的temporarily

see this post

【讨论】:

    【解决方案3】:
    function redirect($url) {
        if(!headers_sent()) {
            //If headers not sent yet... then do php redirect
            header('Location: '.$url);
            exit;
        } else {
            //If headers are sent... do javascript redirect... if javascript disabled, do html redirect.
            echo '<script type="text/javascript">';
            echo 'window.location.href="'.$url.'";';
            echo '</script>';
            echo '<noscript>';
            echo '<meta http-equiv="refresh" content="0;url='.$url.'" />';
            echo '</noscript>';
            exit;
        }
    }
    
    // How to use
    $url = "www.google.com";
    redirect($url);
    

    【讨论】:

    • 感谢@Phill 的回答。你用这个功能为我节省了很多时间。
    • 嗯。我相信编码人员应该决定在给定情况下他想使用哪种类型的重定向,而不是依赖于为他选择的函数。例如。如果您想通过location 发出 HTTP 请求,那么您应该确保尚未发送标头,而不是在发送时使用回退。至少我是这么认为的
    【解决方案4】:

    最安全的方法是使用标头重定向

    header('Location: http://www.example.com/', true, 302);
    exit;
    

    但请注意,它必须在任何其他输出发送到浏览器之前发送。

    【讨论】:

      【解决方案5】:
      header('Location: http://www.example.com/', true, 302);
      exit;
      

      参考:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

      编辑:

      此响应仅在以下情况下可缓存 由 Cache-Control 或 过期标头字段。

      【讨论】:

      • 这正是我所需要的,我正在做与这个问题完全不同的事情,但答案很好:)
      • 更好用:header("Cache-Control: no-cache"); header('位置:example.com', true, 302);退出;
      【解决方案6】:
      header('Location: http://example.com/path/to/file');
      

      【讨论】:

        【解决方案7】:

        重新加载页面并强制其不从缓存中取出的最佳方法是将随机 id 或时间戳附加到 url 的末尾作为查询字符串。它使请求每次都是唯一的。

        【讨论】:

        • 这可能是最好的方法,这样做很奇怪。想象一下:www.google.com.br?randomId=12381289371 最好的方法应该是发送适当的标头。
        【解决方案8】:

        试试这个:

        echo '<script>document.location.replace("someurl.php");</script>';
        

        这应该替换浏览器历史记录而不是缓存。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-18
          • 1970-01-01
          • 1970-01-01
          • 2011-11-19
          • 1970-01-01
          • 1970-01-01
          • 2015-01-06
          相关资源
          最近更新 更多