更改目录时PHP会话数据丢失了吗?

时间:2010-04-24 19:49:58

标签: php session directory

我有一个使用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安装中,在没有我注意的情况下进行了更改。

6 个答案:

答案 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和会话变量是一个不同的理想解决方案,但这能够解决我的问题。

See here for documentation

答案 4 :(得分:0)

确保每个目录中都有相同的php.ini文件,以便从中访问会话变量。

答案 5 :(得分:-1)

这就是为什么你不应该使用目录来制作虚假友好的URL ......

每次需要会话时都不要忘记调用session_start()。