在子目录中无法访问会话变量

Posted

技术标签:

【中文标题】在子目录中无法访问会话变量【英文标题】:Session variables not accessible in subdirectory 【发布时间】:2015-05-03 13:50:19 【问题描述】:

当我们将项目从 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(); 中的会话块;除了 session.save_path 设置在 beta 服务器上但不在 live 服务器上(这可能意味着它将默认为 /tmp),两者的配置是相同的。

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

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

【问题讨论】:

测试文件夹是否在子域或类似的地方?如果是这样,它无法跨域读取会话 cookie,如果您在 session_start 之后移动 session_id,将会发生什么。 我测试了这段代码,在子文件夹中我也得到了正确的输出 这是第二页,我的会话变量和我的会话 cookie:Hello World581186accf44d7e80df40d0b5a47fb7d 是的,正如我所说,这也适用于我们的测试服务器,但不适用于实时服务器。所以我的问题真的是:什么 php 配置变量会阻止这段代码工作? 是的,一切都在同一个域中。 你在会话存储位置..etc中是否有写权限 【参考方案1】:

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

date.timezone =  Australia/Melbourne
magic_quotes_gpc = Off

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

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

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

这已经解决了问题。

感谢大家的帮助!

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

看看它是否仍然出错。

【讨论】:

是的,还是不行。感谢您的帮助,对不起,我花了这么长时间才回复您。与其他项目分道扬镳。 理论上,这不应该发生,但我有同样的问题。我只能访问在该子目录的子目录中创建的会话变量,而不能在根目录或任何其他子目录中访问。

以上是关于在子目录中无法访问会话变量的主要内容,如果未能解决你的问题,请参考以下文章

codeigniter 无法访问另一个控制器中的会话数据

为啥在ios中重新打开会话后无法访问facebook好友列表

无法访问 Powershell 远程会话中的 UNC 路径

从会话中获取文件时出现“无法访问已关闭的文件”错误消息

无法访问 freemarker 模板中的会话属性

Laravel - 无法在 Exception Handler.php 文件的渲染功能中访问会话