在PHP中重定向/重新加载页面的最佳方法是什么?

10

在PHP中,最好的页面重新加载/重定向方式是什么,可以完全删除所有历史记录/缓存?应该使用哪些头信息?

发生了什么:

单击链接时,会设置GET参数并执行脚本。完成后,我想重定向和重新加载页面,而不带有GET参数。一开始似乎什么都没有发生,但按下F5后,更改才会出现。

我想要的:

重定向并重新加载页面,以便更改出现而无需按下F5。


你需要更具体一些。你想要哪个页面不出现在历史记录中?是你正在调用的页面还是你正在重定向到的页面?缓存也是同样的情况。 - Pekka
8个回答

27

这正是我所需要的,我在做与这个问题完全不同的事情,但答案非常好用 :) - TURTLE
最好使用:header("Cache-Control: no-cache"); header('Location: http://www.example.com/', true, 302); exit; - Mahdi Jazini

24
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提供的答案。你用这个函数为我节省了很多时间。 - MikeS
嗯,我认为程序员应该决定在特定情况下要使用哪种类型的重定向,而不是依靠函数来为他选择。例如,如果您想通过 location 进行 HTTP 请求,则应确保尚未发送标头,而不是在它们已发送时使用后备。至少我是这样认为的。 - Kos

7
最好的刷新页面并强制不从缓存中获取的方法是将随机id或时间戳附加到url末尾作为查询字符串。这使得每次请求都是唯一的。

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

3

试试这个:

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

这应该替换浏览器历史记录,但不影响缓存。


1
header('Location: http://example.com/path/to/file');

1

仅供参考,与SEO相关:

301会告诉搜索引擎在其索引中替换URL。因此,如果使用301将url1重定向到url2,则所有主要搜索引擎[Google、Yahoo + Bing]都会用url2替换url1。

302的工作方式不同。它表示该URL位于其他地址中临时

查看此帖子


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();
?>

虽然这段代码可能解决问题,但好的回答也应该解释代码究竟是如何实现问题解决的,以及它的工作原理。 - BDL

0

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接