在子域中维护会话变量

时间:2012-02-16 19:16:00

标签: php session-variables session-cookies subdomain

我一直在努力维护两个子域之间的会话变量,并发现它是不可能的。我最终创建了2个最小的PHP网页作为测试床,我称之为“测试1”只是设置

$_SESSION['test'] = "Fred";

并且有一个指向'test 2'的超链接,它只是试图回显$ _SESSION ['test']的值来证明它是否有效。我在我的www域中放置'test 1',在我的子域中放置'test 2'。我从各种来源尝试各种版本的标题。以下是主要的3(当然还有他们的变体):

ini_set('session.cookie_domain',substr($_SERVER['SERVER_NAME'],strpos($_SERVER['SERVER_NAME'],"."),100));
session_start();

ini_set('session.cookie_domain','mydomain.com');
session_start();

ini_set('session.cookie_domain', PHP_INI_ALL);
session_start();

session_set_cookie_params(0, "/", ".mydomain.com", false);
session_start();

我发现在每种情况下都会得到相同的结果。会话不在子域中进行,页面测试2不知道我将$ _SESSION ['test']设置为什么值。然而,上述方法之一应该起作用的网络似乎有很多确定性。知道会发生什么,尤其是因为我使用最小的页面来测试机制(没有我能看到的副作用)?顺便说一句,我在共享服务器上,如果这是相关的。

感谢您的想法。坦率。

修改即可。 我修好了。这个问题是由Suhosin引起的。请参阅本页脚下的详细答案。

2 个答案:

答案 0 :(得分:5)

好的,我钉了它,这是一个臭。

Suhosin的suhosin.session.cryptdocroot选项是问题的全部原因。当会话加密密钥基于DocRoot时,当从不同目录提供基本域和子域时,它会导致子域无法看到彼此的会话变量。这导致服务器上的会话变量存储在不同的文件夹中,因此每个相应的域都看不到它们。

解。只需在php.ini文件中添加以下两行:

suhosin.session.cryptdocroot=Off
suhosin.cookie.cryptdocroot=Off

48小时噩梦追踪,4.8秒修复。

答案 1 :(得分:0)

我有它工作,设置会话名称和会话cookie参数:

$some_name = session_name("some_name");
session_set_cookie_params(0, '/', '.some_domain.com');
session_start();