当url包含参数时,header()无法在php中工作?

时间:2015-05-13 21:25:27

标签: php redirect http-headers url-redirection http-redirect

所以我使用$_GET来抓取网址以便稍后使用,但是当我使用$_GET时,它不会重定向!


所以这是我的示例代码: 网址:http://localhost/project/active.php/?s=ieugfshd&h=qwuyrbcq&i=1

php代码:

<?php
include 'init.php';
$s = trim($_GET['s']);
$h = trim($_GET['h']);
$i = trim($_GET['i']);
$q = key_check($s,$h,$i);
if($q == 1)
{
header("location:password_active.php");
exit;
}
if($q == 0)
{
header("location:login_failed.php");
exit;
}
?>


编辑:
key_check()函数

function key_check($k1,$k2,$id)
{
$query = mysql_query("select key1 from users where user_id = '$id'");
$key1 =mysql_result($query,0);
$query = mysql_query("select key2 from users where user_id = '$id'");
$key2 =mysql_result($query,0);
$y=strcmp($k1,$key1);
$z=strcmp($k2,$key2);
if($y || $z == 0)
{
return 1;
}
else
{
return 0;
}
}

现在,当我尝试这个时,我得到了“1”,但我得到了

  

此网页有重定向循环

但我的password_active.php没有任何重定向。这只是一个HTML页面。

2 个答案:

答案 0 :(得分:4)

您用来访问脚本的网址是:

http://localhost/project/active.php/?s=ieugfshd&h=qwuyrbcq&i=1

这会加载active.php,它会发挥作用,然后尝试发送以下标题:

header("location:password_active.php");

浏览器收到此标头,并尝试通过在查询字符串(password_active.php字符串)之前的最后一个斜杠之后添加?s=xxx来解析该相对URL。

所以你的浏览器加载:

http://localhost/project/active.php/password_active.php?s=ieugfshd&h=qwuyrbcq&i=1

再次加载active.php,再次发挥其作用,然后再次发送相同的标题,并加载此页面:

http://localhost/project/active.php/password_active.php?s=ieugfshd&h=qwuyrbcq&i=1

再次。然后再次。然后再次。经过多次尝试,您的浏览器会理解出现问题并停止。

您应该在HTTP标头中使用绝对URL:

header("Location: /project/password_active.php");

另外,请注意如何根据标准编写HTTP标头。

随机笔记:

  • 根据文件名,$s$h都是密码。您应该hash them,而不是通过网址传递它们。
  • if($y || $z == 0)不太可能像您想象的那样工作,因为它会在伪代码中被评估为if y or not z,而您可能希望if not y and not z进行密码检查。

此外,在exit()标题后调用Location的好处。你永远不应该忘记这一点,因为它非常重要,如果你忘了它们,可能会在你的脚本中造成一些麻烦。

答案 1 :(得分:1)

尝试删除/ after.file后。像index.php?i = sa