我正在尝试设置一个简单的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>';
};
}
?>
答案 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中编码来修复它。