即使重定向到第2页,Firefox也会刷新第1页

时间:2010-05-11 18:59:57

标签: php redirect

这是一个非常奇怪和恼人的问题,可以通过下面的脚本复制。

  1. 假设我们有两个页面:script.phpscript.php?second
  2. 第1页创建了一些数据库条目并重定向到第2页。
  3. 在第2页上,向用户显示所述条目的编辑。
  4. 如果页面1由于某种原因在第一次尝试时崩溃,并打印出一些错误消息,则会发生奇怪的事情。如果我们刷新第1页(这次重定向很好),每次连续刷新(第2页)都会实际刷新第1页并再次重定向到第2页。

    在上面的示例中,这将为每次刷新创建新的数据库条目,这是我想通过重定向到第2页来避免的问题。

    <?php
    
    header('Content-type: text/plain');
    
    session_start();
    
    if (!isset($_GET['second'])) {
    
        $_SESSION['counter'] = isset($_SESSION['counter']) ? $_SESSION['counter'] + 1 : 1;
        /*$_SESSION['counter'] = 0;
        exit('asd');*/
        header("Location: {$_SERVER['PHP_SELF']}?second", true, 303);
        exit;
    
    }
    
    echo "Counter: {$_SESSION['counter']}";
    

    要尝试上述完整脚本,首先运行完整的注释代码,然后启用注释代码。

    我尝试过301,302和303重定向。有人知道为什么会这样?

2 个答案:

答案 0 :(得分:0)

来自RFC 2616

   10.3  Redirection 3xx .............................................61
   10.3.1   300 Multiple Choices .....................................61
   10.3.2   301 Moved Permanently ....................................62
   10.3.3   302 Found ................................................62
   10.3.4   303 See Other ............................................63
   10.3.5   304 Not Modified .........................................63
   10.3.6   305 Use Proxy ............................................64
   10.3.7   306 (Unused) .............................................64
   10.3.8   307 Temporary Redirect ...................................65

我认为您在浏览器中看到了重定向,因为您正在使用“永久”重定向。

尝试状态代码307,或完全省略该参数以使用默认值(然后找出它是什么,让我们知道!)

答案 1 :(得分:-1)

您正在检查是否设置了get变量second。但是你没有在重定向上设置它。

尝试

header("Location: {$_SERVER['PHP_SELF']}?second=1", true, 303);