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

时间:2015-03-03 02:04:00

标签: php session session-variables server-configuration

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

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

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

测试/使page2.php

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

如您所见,会话变量已消失。但会话ID cookie保留在子目录中,因此它不是cookie问题。

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

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

因为此测试适用于我们的测试版服务器,所以我得出结论认为这是一个php配置问题,但如果有人能指出我需要更改的参数,那将非常感激!

3 个答案:

答案 0 :(得分:2)

好吧,问题似乎发生了,部分原因是由于我不了解将自己的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文件夹中。

这解决了这个问题。

感谢大家的帮助!

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

并查看它是否仍然出错。