子目录中的会话变量不可访问


Session variables not accessible in subdirectory

当我们将项目从测试服务器转移到实时服务器时,我们遇到了以下情况:

只有当访问会话变量的文件与创建它们的文件位于同一文件夹中时,才能访问会话变量。我们的测试版服务器并非如此。所以我创建了三个非常简单的测试文件:

test.php

<?php
session_id("581186accf44d7e80df40d0b5a47fb7d");
session_start(); 
$_SESSION['myvariable'] = 'Hello World';
?> 
<html>
    <body>
        <p><a href="page2.php">Same folder test</a></p>
        <p><a href="test/page2.php">Subfolder test</a></p>
    </body>
</html>

然后,我们在同一文件夹和test/文件夹中复制了以下文件。

page2.php

<?php 
session_start();
print 'Here is page two, my session variable and my session cookie: '; 
print $_SESSION['myvariable']; 
print $_COOKIE['PHPSESSID'];
exit; 
?>

结果如下:page2.php

Here is page two, my session variable and my session cookie: Hello
World581186accf44d7e80df40d0b5a47fb7d

test/page2.php

Here is page two, my session variable and my session cookie: 581186accf44d7e80df40d0b5a47fb7d

正如您所看到的,会话变量已经消失。但是会话ID cookie保留在子目录中,所以它不是cookie问题。

我已经查看了phpinfo()中的会话块;除了session.save_path(它在测试版服务器上设置,但在实时服务器上没有设置)之外(这可能意味着它将默认为/tmp),两者的配置都是相同的。

此外,我们没有.htaccess文件,该文件可能会将domain.com路径更改为www.domain.com路径。

因为这个测试在我们的测试版服务器上运行,所以我得出结论,这是一个php配置问题,但如果有人能给我指出需要更改的参数,我将不胜感激!

好的,出现这个问题的部分原因是我不了解将自己的php.ini放在public_html文件夹中会做什么。因为我们不能在共享服务器上使用ini_set()(它已被禁用),所以我创建了php.ini的本地副本,其中包含以下行以覆盖dud默认设置。。。

date.timezone =  Australia/Melbourne
magic_quotes_gpc = Off

我假设这个php.ini本地版本中的值会简单地覆盖主php.ini中的值

不幸的是,这不是Jumba/UberGlobal主机上的情况。创建这个本地php.ini意味着除了这两个设置之外,整个配置都恢复为默认值。

解决方案是让Jumba/Uberglobal的一位技术人员复制他们的php.ini文件(只更改了上面两个值),并将其放在我们的public_html文件夹中。

这已经解决了问题。

感谢大家的帮助!

我也遇到了类似的问题。我能够通过确保php.ini文件的副本存在于我想要访问的每个子目录中来修复它。

这不应该发生。。。但好吧。你可以尝试一件事,在根目录中创建一个文件,并将其包含在所有文件中。这样,您就可以在该通用文件中运行session_start。

/common.php /file1.php (include common.php) /test/file2.php (include ../common.php - check paths and such)

看看它是否仍然出了问题。