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

3
我有一个简单的使用PHP会话的登录系统,但最近发现,如果您访问某个目录之外的页面(例如/login/),即使您已经登录,您也将一直被标记为未登录。似乎在更改目录时(例如/login/user/),我的会话数据丢失了。
我认为自出现问题以来我没有动过代码,是我的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安装中已更改但没有通知我的某些设置。

2
你能发布/login/user/的主站点内容吗?比如main.phpindex.phpdefault.php。问题可能很简单,只是页面顶部没有调用session_start。但更多关于问题的信息会得到更多答案。 - Anthony Forloney
在需要授权的每个文件中,它都会加载一个loginfunctions.php文件,该文件调用session_start()并检查登录。即使我更新了所有相关路径和链接,也会导致在/login中工作的文件在我复制并粘贴到/login/user中后停止工作。在/login/user中只有5个具有随机名称的php文件(这是网站的后端,不太美观)。 - Ineffable
6个回答

2
也许您没有在不在/login/目录下的页面开头调用session_start()函数?

编辑了我的第一篇帖子以展示我是如何调用它的。此外,如果它们位于主目录/login/中,则相同的页面可以正常工作。 - Ineffable
谢谢!我犯了一个傻小错误。哈哈 - Harry

1

我曾经遇到过类似的问题。 请检查您是否有php.ini文件。删除该文件可以解决问题。但仍需进一步研究原因。即使php.ini文件为空,也会阻止会话数据在多个目录之间传递...


为了澄清,您当前目录中有一个php.ini文件。显然,您的某个地方都有一个php.ini文件... - sessionddrivingmemad
你是否解决了这个问题,以便在目录中拥有php.ini文件?我有一个问题,需要在特定目录中使用PEAR的php.ini。但是访问该目录会清除我存储的其他变量。例如,$_SESSION ['first_name']丢失,但会话ID保留。 - liamvictor

0

他们可能更改了php.ini设置session.cookie_path

在调用session_start之前,您应该调用session-set-cookie-params并确保自己设置cookie路径。将其设置为您希望会话有效的最高级目录。例如,如果您将其设置为/login,则它将对/login/login/user有效。如果您希望会话对整个站点有效,请将路径设置为/


我尝试设置session_set_cookie_params(3600, "/"),但没有效果。另外,我检查了我的php信息中的session.cookie_path,它已经设置为"/"了。 - Ineffable
嗯,不确定问题可能是什么。请编辑您的问题并发布一些代码。 - Josh
我已经更新了我的帖子,感谢你抽出时间回复。 - Ineffable
当您登录时,是否设置了cookie?如果是,则域和路径是否正确?您可以在Firefox中的“工具>页面信息”下检查cookie,在“安全”选项卡中。 - Josh

0
我曾经遇到过类似的问题。你可以使用以下代码: <? setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); ?> 或类似的代码。我知道Cookie和Session变量是不同的解决方案,但这个方法可以解决我的问题。 请参阅此处的文档

0

请确保您在想要访问会话变量的每个目录中都有相同的php.ini文件。


-1

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

别忘了每次需要会话时调用session_start()。


1
“使用目录来制作伪友好URL”与此有何关系?我在几乎每个系统中都采用“友好的URL”,从未遇到过任何问题。还有,你是否注意到StackOverflow.com也是这么做的呢? - Josh
我认为他的意思是,大多数友好的URL是通过重写而不是实际的磁盘目录来创建的。 - erisco
@erisco:啊,谢谢你的澄清。这很有道理。但无论是否重写,问题仍然会出现——浏览器并不知道正在发生重写,cookie路径(如果是问题)仍必须正确设置。 - Josh
这些URL中涉及的内容不会被重写。请查看原帖的评论以了解我如何调用session_start()。 - Ineffable
另外,你认为我应该如何组织这些文件呢?如果它们都堆在同一个目录下,维护起来会很麻烦吧? - Ineffable

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接