0

我正在使用会话将用户登录到我的网站。

登录表单将输入发送到 login-exec 文件,该文件然后查询 db 并验证登录信息。我放置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 来验证会话。

帐户.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 文件保存在没有 BOM 的 UTF-8 中,因为我最初认为在会话开始之前有前导空白。那并没有解决问题,我真的无法弄清楚。

关于为什么会发生这种情况的任何想法?

4

2 回答 2

0

我相信问题是我的 login-exec.php 脚本中的重定向 url。例如:

如果我通过访问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/ 的完整 URL,但这样做会限制用户和脚本的可移植性。如此简单的答案..确保域保持不变。如果不是,您可以设置会话名称,我很确定这也可以解决此问题。然而,在我的情况下header('Location: script.php');,成功了。

于 2012-10-22T02:49:13.900 回答
-1

摆脱 session_write_close();

如果这不能解决问题,则可能是您丢失了 account.php 文件中的会话。

session_start();在需要 auth.php 页面之前进行调用。

于 2012-10-21T16:38:09.947 回答