重复重定向错误

时间:2011-02-15 23:36:03

标签: php redirect header

我很久以前就已经发布了一个问题,但我仍然找不到答案。基本上,当用户登录帐户并且一段时间处于非活动状态时,当他们返回时,他们会点击某些内容,然后系统会将其注销,他们必须重新登录。它有90%的时间可以工作,但有时会出现如下错误:此页面以永远不会完成的方式重定向。

但是当用户清除cookie时,它工作正常,有时关闭选项卡并打开一个新选项也有效。

以下是代码:

<?php
$SUBDOMAIN = mysql_real_escape_string($_GET['p_name']);
$pname = mysql_real_escape_string($_GET['p_name']);
echo "$p_name";
include("db.php");
?>

<?php
session_start(); 

// Process the POST variables
$username = $_SESSION["user_name"];
//$password = $_POST["password"];

// Set up the session variables
$_SESSION["user_name"] = $username;

$ugData = $_REQUEST['p_name'];

if($_POST)
{
   $_SESSION['user_name']=$_POST["user_name"];
   $_SESSION['password']=$_POST["password"];  
}

$secret = $info['password'];

//Checks if there is a login cookie
if(isset($_COOKIE['ID_my_site']))
//if there is, it logs you in and directes you to the members page
{ 
   $username = $_COOKIE['ID_my_site']; 
   $pass = $_COOKIE['Key_my_site'];
   $check = mysql_query("SELECT user_name, password FROM accounts WHERE user_name = '$username' and p_name='$ugData'")or die(mysql_error());
   while($info = mysql_fetch_array( $check ))
   {
      if (@ $info['password'] != $pass) 
      {
      }
      else
      {
         header("Location: home.php");
      }
   }
}

//if the login form is submitted 
if (isset($_POST['submit'])) 
{ 
   // if form has been submitted
   // makes sure they filled it in
   if(!$_POST['user_name'] | !$_POST['password']) 
   {
      die('You did not fill in a required field.');
   }
   //checks it against the database

   if (!get_magic_quotes_gpc()) 
   {
      $_POST['user_name'] = addslashes($_POST['user_name']);
   }

   $check = mysql_query("SELECT user_name,password FROM accounts WHERE user_name = '".$_POST['user_name']."' and p_name='".$ugData."'")or die(mysql_error());

   //Gives error if user dosen't exist
   $check2 = mysql_num_rows($check);

   if ($check2 == 0) 
   {
      die('That user does not exist in our database. <a href=add.php>Click Here to Register</a>');
   }

   while($info = mysql_fetch_array( $check ))    
   {
      $_POST['password'] = md5($_POST['password']);
      $_POST['password'] = $_POST['password'];

      //gives error if the password is wrong
      if (@ $_POST['password'] != $info['password']) 
      {
         die('Incorrect password, please try again');
      }
      else 
      { 
         // if login is ok then we add a cookie 
         $_POST['user_name'] = stripslashes($_POST['user_name']); 
         $hour = time() + 3600; 
         setcookie(ID_my_site, $_POST['user_name'], $hour); 
         setcookie(Key_my_site, $_POST['password'], $hour);

         //then redirect them to the members area 
         header("Location: home.php"); 
      } 
   } 

} 
else 
{    
   // if they are not logged in 
?> 
   </table> 
   </form> 
<?php 
} 

?> 

3 个答案:

答案 0 :(得分:1)

嘿,你的代码格式化真的很糟糕没有乐趣,你可能想解决这个问题。 :)

我只是快速浏览一下,错误只发生了90%或者有时难以捕捉。

我发现你最后使用header("Location: home.php");而没有任何exit;,除非你打算这样做,否则这通常是一个坏主意。

函数调用header("Location: home.php");不会停止处理脚本。用户可能会获得标题并重定向并停止处理代码(取决于某些php设置),但可能会在用户重定向之前设置一些cookie。所以尝试添加退出;重定向标题调用后。

格式化代码

答案 1 :(得分:1)

我猜赌这会因为您的会话Cookie的过期时间不同以及您为ID_my_siteKey_my_site Cookie设置的过期时间而产生。如果未被覆盖,则默认会话超时为30分钟(在设置中表示为秒 - 因此为1,800)。您的Cookie将在一小时后过期。因此,您可能会发现自己处于会话已过期的情况,但其他Cookie仍然存在。根据您检查事物的顺序/方式然后重定向,如果用户闲置超过30分钟但不到1小时,您将遇到这种情况。

由于您在此代码示例中执行的唯一重定向是home.php,因此在该文件中会进行某种检查,即在永无止境的重定向螺旋上发送它们。

顺便说一句,该代码示例确实非常混乱。例如,您经常分配和重新分配$username变量(以及看似不同类型的事物 - 虽然我不知道如果没有看到实际输入),难怪您有神秘问题。例如,这几行是多余的:

// Process the POST variables
$username = $_SESSION["user_name"];
//$password = $_POST["password"];

// Set up the session variables
$_SESSION["user_name"] = $username;

您正在从会话中分配$username并立即将其分配回来。

从文件的开头:

$SUBDOMAIN = mysql_real_escape_string($_GET['p_name']);
$pname = mysql_real_escape_string($_GET['p_name']);

这两个变量被赋予相同的$_GET值,但似乎并未使用$SUBDOMAIN

从文件末尾开始,您要分配两次相同的值:

$_POST['password'] = md5($_POST['password']);
$_POST['password'] = $_POST['password'];

我真的很鼓励你退出代码,看看你的输入,找出你需要完成什么,并完全重构或重写这段代码。有这样的东西漂浮在你周围,难怪你的系统中有神秘的错误。

答案 2 :(得分:1)

此外,HTTP Location标头要求U​​RL是绝对的。你应该使用这样的东西:

$ currentServerHost = $ _SERVER ['HTTP_HOST'];    $ currentBaseURI = $ currentServerHost。 rtrim(dirname($ _ SERVER ['PHP_SELF']),'/ \');

header('Location:'。'http://'。$ finalURI。'/ home.php');    出口;