我有一个使用PHP会话的简单登录系统,但就在最近,如果您访问不在某个目录(/ login /)中的页面,您将始终被标记为未登录,即使您已经登录。当我更改目录(例如,到/ login / user /)时,我的会话数据似乎丢失了。
我认为自从问题出现以来我自己都没有触及过代码,我的网站主机可以对我的PHP安装做些什么来删除会话数据,是否有解决方法?
编辑:
在每个需要授权的文件中,它会加载一个loginfunctions.php文件,该文件调用session_start()并检查登录。即使我更新了所有相关路径和链接,在/ login中复制并粘贴到/ login / user中的文件也会停止工作。
EDIT2: 好的,有些代码。
在给我错误的实际页面中,这是auth。代码:
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安装中,在没有我注意的情况下进行了更改。
答案 0 :(得分:2)
也许你没有在/ login / ..页面的开头调用session_start()?
答案 1 :(得分:1)
我有类似的问题。 检查你没有php.ini文件。删除这个排除了问题。仍在寻找原因。 php.ini文件甚至可能是空白的,它会阻止会话数据转移到多个目录...
答案 2 :(得分:0)
他们可能会更改php.ini设置session.cookie_path。
在致电session_start
之前,您应致电session-set-cookie-params,并确保自行设置Cookie路径。将其设置为您希望会话有效的最高级别目录。 EG如果将其设置为/login
,则对/login
和/login/user
有效。如果您希望会话对etire网站有效,请将路径设置为/
答案 3 :(得分:0)
<?
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); ?>
或类似的东西。我知道cookie和会话变量是一个不同的理想解决方案,但这能够解决我的问题。
答案 4 :(得分:0)
确保每个目录中都有相同的php.ini
文件,以便从中访问会话变量。
答案 5 :(得分:-1)
这就是为什么你不应该使用目录来制作虚假友好的URL ......
每次需要会话时都不要忘记调用session_start()。