php中的header()函数:没有任何重定向!

时间:2010-03-24 16:42:54

标签: php

我写的非常非常简单!! php中的脚本。标头重定向不起作用。 1-编码:没有BOM的UTF-8 2-添加ob_start()问题就是问题。 我的代码有什么问题;

的login.php:

<?php  session_start();
   require_once("funcs.php"); 
   db_connection();
   $username = $_POST['username'];
   $password = $_POST['pwd'];
   $submit = $_POST['login'];
   if($submit){
    if (!filled_out($_POST)) {
                echo "please fill all fields";
            }
     else{
        $query = "SELECT * FROM *** WHERE username ='{$username}' AND password ='{$password}'";
        $result = mysql_query($query);
            if(mysql_num_rows($result) == 1){
                 $found_user = mysql_fetch_array($result);
                 $_SESSION['id']  = $found_user['id'];
                 $_SESSION['username'] = $found_user['username'];
                 $_SESSION['password'] = $found_user['password'];
                 setcookie(session_name(), '', time()+86400, '/');
                 header("Location: tst.php");
                 }
                 else{
                    echo "incorrect username or password";
                 }

           }
      }     


?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
<form id="form1" name="form1" method="post" action="">
  <p>
    <label for="username">
      Username:
    </label>
    <input type="text" name="username" id="username" />
  </p>
  <p>
    <label for="textfield">
      Password
    </label>
    <input type="password" name="pwd" id="pwd" />
  </p>
  <p>
    <input name="login" type="submit" id="login" value="Log in" />
  </p>
</form>
</body>
</html>
<?php 

 db_disconnect();

?>

和tst.php:

<?php session_start();  
  require_once("funcs.php");    
  if (!isset($_SESSION['id'])){
           header("Location : login.php");
         }
 ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
<table id="structure">
  <tr>
    <td id="navigation">&nbsp;</td>
    <td id="page"><?php echo "welcome"."". $_SESSION['username']; ?></td>
  </tr>
</table>
</body>
</html>

直接对tst.php进行操作,header()不会重定向到login.php

8 个答案:

答案 0 :(得分:4)

尝试添加die():

  header("Location: tst.php");
  die();

您应该始终添加die(),因为位置标题只是对浏览器更改页面的请求。如果您没有die(),页面的其余部分仍会到达浏览器,包括用户可能不会看到的敏感数据。

答案 1 :(得分:3)

尝试删除“位置”后的空格:

header("Location: login.php");

请注意我对正确格式化代码的评论,因为很难发现其他任何可能不对的问题。

答案 2 :(得分:2)

在打开<?php标记之前检查空格。很难从这里的格式中判断出是否存在,但是在代码执行之前会发送空格,从而阻止标题。还要在包含文件中的任何结束标记后检查空格。 (更好的做法是完全省略结束标签)

旧回答

您正在使用setcookie()来发送标头,然后尝试重定向。一旦发送标头,您就无法重定向。 (对不起,这是不正确的)

答案 3 :(得分:1)

标题不仅仅是一个php函数。它确实修改了http标头的一部分,所以不可能有一部分标题,然后是html数据,然后是另一个标题。为了使它工作,你应该在任何html输出完成之前将标题放在文件的开头。

答案 4 :(得分:1)

重定向可以采用相对或绝对URL。问题在于结肠前的空间。试试这样:

header("Location: whatever.php");

答案 5 :(得分:1)

我猜重定向有效,但你用空值覆盖Session-Cookie。所以tst.php创建一个新的空Session并重定向回login.php。

尝试:

// DELETE this line: setcookie(session_name(), '', time()+86400, '/');
header("Location: tst.php?".SID);

Importent:标头+会话总是需要SID才能失去会话!

更正:感谢@Pekka。

答案 6 :(得分:0)

与其他答案一样,Location:标题应包含绝对URL,示例标题(“Location:http://example.com/”);

答案 7 :(得分:0)

你需要在header函数之后放一个exit()或die() - 否则脚本的其余部分将继续执行。