我正在使用会话将用户登录到我的网站。
登录表单将输入发送到login-exec文件,然后该文件查询数据库并验证登录信息。我已将session_start();
放在login-exec文件的开头,然后使用下面的代码段将数据写入会话:
session_regenerate_id();
$member = mysql_fetch_assoc($result);
$_SESSION['SESS_MEMBER_ID'] = $member['id'];
$_SESSION['Username'] = $member['username'];
$_SESSION['key'] = $member['Serial'];
session_write_close();
header('Location: account.php');
在account.php文件的开头我已经要求auth.php来验证会话。
account.php:require_once('auth.php');
auth.php:
<?php
//Start session
session_start();
//Check whether the session variable SESS_MEMBER_ID is present or not
if(!isset($_SESSION['SESS_MEMBER_ID']) || (trim($_SESSION['SESS_MEMBER_ID']) == '')) {
header("Refresh: 5; url=login.php");
//echo $_SESSION['SESS_MEMBER_ID'];
die("Access Denied!");
exit();
}
?>
始终首次登录时会返回拒绝访问权限。当脚本重定向回登录页面并且我再次尝试它总是有效...我已经将我的php文件保存为UTF-8而没有BOM,因为我原本以为在会话开始之前有领先的空白区域。这没有解决问题,我真的无法解决这个问题。
有关为何发生这种情况的任何想法?
答案 0 :(得分:0)
我认为问题是我的login-exec.php脚本中的重定向网址。例如:
如果我通过转到http://www.mydomain.com/mysubdirectory/login.php加载login.php脚本并且login-exec.php中的标头重定向指向http://subdomain.mydomain.com/account.php,则由于域已更改,正在重新生成PHPSESSID。
所以我将标题重定向更改为account.php而不是完整的网址,这解决了问题。
我本可以使用完整的URL subdomain.mydomain.com或mydomain.com/subdirectory/,但这样做会限制用户和脚本的可移植性。如此简单的答案......确保域名保持不变。如果不是,你可以设置会话名称,我很确定会解决这个问题。但是在我的情况下header('Location: script.php');
做了伎俩。
答案 1 :(得分:-1)
摆脱session_write_close();
如果这不能解决问题,可能是您在account.php文件中丢失了会话。
在要求auth.php页面之前拨打session_start();
。