登录时PHP重定向

时间:2013-12-18 04:55:37

标签: php redirect login

我正在尝试设置一个简单的PHP登录脚本,该脚本在成功登录后重定向。问题是标头调用仅在成功登录后手动刷新后才有效。我在SO上找到的这个问题的唯一答案是“在调用标题之前不要回复内容”,但我不相信我。我确实读过session_start发送头文件但是如果我在调用isset之后移动它,那么页面在刷新后没有重定向,导致我认为会话变量没有设置。

 <?php session_start();
 if(isset($_SESSION['logged']))
 {
      header("Location: index.html");
      exit;
 }



     function BuildLogin(){

          include("passwords.php"); 
          if ($_POST["ac"]=="log") { /// do after login form is submitted  
             if ($USERS[$_POST["username"]]==$_POST["password"]) { 
                 $_SESSION["logged"]=$_POST["username"]; 
             } else { 
                echo 'Incorrect username/password. Please, try again.'; 
             }; 
          }; 
          if (!array_key_exists($_SESSION["logged"],$USERS)) {  
               echo '<form action="login.php" method="post"><input type="hidden" name="ac" value="log"> '; 
               echo 'Username: <input type="text" name="username" />'; 
               echo 'Password: <input type="password" name="password" />'; 
               echo '<input type="submit" value="Login" />'; 
               echo '</form>'; 
          }; 
    }
 ?>

 <!doctype html>
 <html lang="en">
 <head>
 <meta charset="utf-8" http-equiv="x-ua-compatible" content="IE=9">
 <title>File Management</title>
 <style type="text/css">/* IE has layout issues when sorting (see #5413) */
 .group { zoom: 1 }

 body{
     padding:0px 25px 25px 25px;
 }


 #content {
     background-color:#989898;
     box-shadow: 0px 10px 20px rgba(0,0,0,.5);
     border-top-right-radius: 4px;
     border-top-left-radius: 4px;
     border-bottom-right-radius: 4px;
     border-bottom-left-radius: 4px;
     padding:25px 25px 25px 25px;
     height:auto;
     overflow:auto;
     }




 </style>
 </head>
 <body>
 <div id="content">
 <?php BuildLogin(); ?>
 </div>
 </body>
 </html>

感谢TheBeacon的解决方案。这是PHP的更新版本

 <?php 
 session_start();
 if (isset($_POST["ac"]) && !empty($_POST) && $_POST["ac"]=="log") {  
      include("passwords.php"); 
      if ($USERS[$_POST["username"]]==$_POST["password"]) { 
         $_SESSION["logged"]=$_POST["username"];
         header('Location: index.html');
     }; 
 }; 


function BuildLogin(){

    include("passwords.php"); 
    if (isset($_POST["ac"]) && !empty($_POST) && $_POST["ac"]=="log") { 
        echo 'Incorrect username/password. Please, try again.';  
    }; 
    if (!array_key_exists($_SESSION["logged"],$USERS)) {  
        echo '<form action="login.php" method="post"><input type="hidden" name="ac" value="log"> '; 
        echo 'Username: <input type="text" name="username" />'; 
        echo 'Password: <input type="password" name="password" />'; 
        echo '<input type="submit" value="Login" />'; 
        echo '</form>'; 
    }; 
 }
 ?>

2 个答案:

答案 0 :(得分:1)

将以下代码放在页面顶部而不是内部功能

 if (isset($_POST["ac"]) && !empty($_POST) && $_POST["ac"]=="log") 
 { /// do after login form is submitted  

   if ($USERS[$_POST["username"]]==$_POST["password"]) 
   { 
     $_SESSION["logged"]=$_POST["username"]; 
   } 
   else 
   { 
      echo 'Incorrect username/password. Please, try again.'; 
   }
 }

<强>前

 if(isset($_SESSION['logged']))
 {
      header("Location: index.html");
      exit;
 }

答案 1 :(得分:1)

问题是您目前正在使用UTF8编码的文本。

在UTF8中保存文本时,某些编辑器(如notepad.exe)会自动在文件中添加BOM(Byte Order Mark),其中包含三个字节:EF BB BF。在编辑时它是不可见的,但PHP会将这些字节视为HTML内容的一部分。所以PHP将刷新HTTP头并开始输出响应体,然后你不能调用header()函数来重定向页面。

某些源编辑器(如Nodepad ++ / Sublime Text / UltraEdit)提供了一种无需BOM即可保存UTF8编码文本的功能。例如,在Notepad ++中,您只需点击编码 - &gt; 在没有BOM的UTF8中编码来修复它。

To encoded as UTF-8 without BOM in Notepad++