我有一个简单的使用PHP会话的登录系统,但最近发现,如果您访问某个目录之外的页面(例如/login/),即使您已经登录,您也将一直被标记为未登录。似乎在更改目录时(例如/login/user/),我的会话数据丢失了。
我认为自出现问题以来我没有动过代码,是我的Web主机可能对我的PHP安装进行了某些更改以删除会话数据,并且是否有解决方法?
编辑: 在需要授权的每个文件中,它加载一个loginfunctions.php文件,该文件调用session_start()并检查登录情况。在/login中正常工作的文件,我复制并粘贴到/login/user中后停止工作,即使我更新了所有相关路径和链接。
编辑2: 好的,这是一些代码。
当我尝试访问这些页面时,出现错误“您无权访问此区域等。”如果我尝试打印$_SESSION变量,则什么也不会显示;它们似乎是空的。但是,如果我将文件移动到/login/文件夹(上一级),并更新链接,则它们完美地工作,并且所有变量都能正确打印出来。这使我认为代码不是出问题的部分,而是PHP安装中已更改但没有通知我的某些设置。
我认为自出现问题以来我没有动过代码,是我的Web主机可能对我的PHP安装进行了某些更改以删除会话数据,并且是否有解决方法?
编辑: 在需要授权的每个文件中,它加载一个loginfunctions.php文件,该文件调用session_start()并检查登录情况。在/login中正常工作的文件,我复制并粘贴到/login/user中后停止工作,即使我更新了所有相关路径和链接。
编辑2: 好的,这是一些代码。
require_once("../../../includes/loginFunctions.php");
$login = new login;
$login->checkLogin(0);
loginFunctions.php中包含以下内容:
class login{
function checkLogin($requiredAccess){
session_start();
if($_SESSION['accesslevel'] < $requiredAccess || $_SESSION['logged_in'] != TRUE){
die("You don't have access to this area. If you should have access, please log in again. <a href='/login/'>Login</a>");
}
if (isset($_SESSION['HTTP_USER_AGENT'])){
if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT'])){
session_destroy();
die("Bad session. Please log in again. <a href='/login/'>Login</a> ");
}
} else {
$_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);
}
if (!isset($_SESSION['initiated'])){
session_regenerate_id();
$_SESSION['initiated'] = true;
}
}
}
$requiredAccess变量是访问此页面所需的访问级别,因此如果您在数据库中具有访问级别3,则可以查看级别0、1、2和3页面。这在主页面调用函数时指定,并与当前用户的访问级别进行比较,该访问级别在其登录时在$_SESSIONS中定义。当我尝试访问这些页面时,出现错误“您无权访问此区域等。”如果我尝试打印$_SESSION变量,则什么也不会显示;它们似乎是空的。但是,如果我将文件移动到/login/文件夹(上一级),并更新链接,则它们完美地工作,并且所有变量都能正确打印出来。这使我认为代码不是出问题的部分,而是PHP安装中已更改但没有通知我的某些设置。
/login/user/
的主站点内容吗?比如main.php
、index.php
或default.php
。问题可能很简单,只是页面顶部没有调用session_start
。但更多关于问题的信息会得到更多答案。 - Anthony Forloney