重定向后PHP会话丢失

时间:2012-07-12 00:37:22

标签: php session redirect

真烦人的问题我无法解决/只能部分解决。适合你的好多汁。

我已经设置了基本的登录系统。像这样:

的login.php:

  1. 第1行:session_start();
  2. 检查if($_SESSION['logged_in'] == true) header("Location: /controls.php);,如果他们已经输入了详细信息。
  3. 如果他们尚未输入,则用户输入凭据(如果有效):$_SESSION['logged_in'] = true;
  4. 检查数据库凭据并将session设置为true后,使用PHP header("Location: /controls.php);
  5. 重定向

    请记住,会话现已设定。

    Controls.php

    1. 第1行:session_start();
    2. 第2行:if($_SESSION['logged_in'] != true) {header("Location: /index.php");}
    3. 我立即被带到了CHROME和FIREFOX的index.php。

      另外,我有accounttools.php,再次需要会话。一旦我尝试访问accounttools.php,会话就被销毁/取消设置,任何加载accounttools.php的尝试都会导致标题重定向到我的/index.php页面,再次只能在FIREFOX和CHROME中。

      我还要加入一些东西。如果我回到login.php并重新登录,一切正常,会话设置正确。这是一个基于浏览器的错误吗? PHP是在任何数据发送到浏览器之前执行的,那么如果PHP在任何事情到达用户时已经被执行了,那么这些浏览器的行为方式如何呢?

      登录文件:

      // Login.php
      <?php session_start();
      
      if($_SESSION['logged_in'] == true)
      {
          header("Location: /controls.php");
          exit();
      }
      
      if($_POST['username_login'] && $_POST['password_login'])
      {
          // Do necessary database work to check credentials (edited out here).
          // ...    
          // Check re-hashed pass against database hash (password checking)
          if($make_password == $current_user[0]['password'])
          {
              // If this is OK login is a success.
              $_SESSION['logged_in'] = true;
              header("Location: /controls.php");
              exit();
          }
      }
      ?>
      

      控制文件:

      // controls.php
      // This page instantly redirects to index.php
      <?php session_start();
      
      // Go to homepage if logging out.
      if($_POST['logging_out']) 
      {
          unset($_SESSION['logged_in']); 
          header("Location: /index.php"); 
          exit();
      } 
      // No access unless logged in.
      // This session seems to no longer exist at this point. Why??
      if($_SESSION['logged_in'] != true)
      {
          header("Location: /index.php");
          exit();
      }
      ?>
      

      编辑:我发现了其他内容:如果我登录并手动输入$_SESSION限制页面的网址,则$_SESSION不会被销毁。

      header()重定向的某些部分导致在Google和Mozilla中取消设置/销毁$_SESSION

      我也像疯子一样谷歌搜索,显然这是PHP编码器中常见的问题。有人必须知道这是什么?

1 个答案:

答案 0 :(得分:1)

我看到成功登录后重定向的方式存在问题:这是一个javascript重定向,所以它只会在所有php完成执行并且结果已发送到浏览器后才会发生。这意味着重定向后的代码也会被执行。

我建议不要在浏览器输出任何内容之前使用:

header("Location: /...");
exit();

组合到任何想要重定向的地方,这样您就可以确保在重定向代码之后会话没有任何反应。

为避免出现headers already sent问题,我还建议您删除以下内容:

?>
<?php

就像login.php的第一行一样。