Php 跨子域维护会话变量

Php 跨子域维护会话变量,php,session-variables,session-cookies,subdomain,Php,Session Variables,Session Cookies,Subdomain,我一直试图在两个子域之间维护会话变量,但发现这是不可能的。最后,我创建了两个最小的PHP网页作为测试平台,我称之为“测试1”只是一个集合 $_SESSION['test'] = "Fred"; 并且有一个指向“test 2”的超链接,它只是试图回显$\u SESSION['test']的值,以证明它是否有效。我将“测试1”放在我的www域中,“测试2”放在我的子域中。我尝试了不同版本的标题,来自不同的来源。以下是主要的3种,当然还有它们的变体: ini_set('session.cookie_

我一直试图在两个子域之间维护会话变量,但发现这是不可能的。最后,我创建了两个最小的PHP网页作为测试平台,我称之为“测试1”只是一个集合

$_SESSION['test'] = "Fred";
并且有一个指向“test 2”的超链接,它只是试图回显$\u SESSION['test']的值,以证明它是否有效。我将“测试1”放在我的www域中,“测试2”放在我的子域中。我尝试了不同版本的标题,来自不同的来源。以下是主要的3种,当然还有它们的变体:

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

我发现我在每种情况下都得到了相同的结果。会话不会跨子域进行,page test 2不知道我将$\u会话['test']设置为什么值。然而,网络似乎有足够的确定性,上述方法之一应该有效。你知道会发生什么吗,特别是因为我用最少的页面来测试机制,我看不到任何副作用?顺便说一句,我在一个共享服务器上,如果这是相关的话

谢谢你的想法。弗兰克

编辑。
我修好了。这个问题是由苏霍辛引起的。请参阅本页底部的详细答案。

我已经让它工作了,设置了会话名称和会话cookie参数:

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

好吧,我把它钉死了,它是个臭东西

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

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

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

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

谢谢。我试着给会议命名——没有乐趣。不过我现在有更多的信息。我尝试了php.net文档中建议的一个测试,并添加了以下内容:$some_name=session_namesome_name$blnResult=ini_setsession.cookie_domain、.mydomain.com;会议开始;如果空$blnResult或$blnResult{echo设置无法设置;exit;}我发现返回结果表明它没有设置!你知道为什么吗?@Frank Anderson我没有试过ini_set方法,只试过session_set_cookie_params方法。谢谢jeroen。我犯了一个笨拙的错误,我明白了,但现在我纠正了这个错误,是的,我现在已经完全按照你在这里建议的那样使用了设置。不过,只要会话变量位于子域中,它的值就不会被传递到“receiving”页面。还可能是什么,或者我可能尝试进行什么其他诊断来找出发生了什么?注意,我使用会话_id进行了检查,发现两个页面上的会话id实际上是相同的-更奇怪的是,会话变量在第二页上没有值!有什么想法吗?@Frank Anderson当你进行var_dump$\会话时,你看到了什么;在这两个页面上,结果是否完全不同?要追踪48小时的噩梦,要修复4.8秒-超级。我理解你:
session_set_cookie_params(0, "/", ".mydomain.com", false);
session_start();
$some_name = session_name("some_name");
session_set_cookie_params(0, '/', '.some_domain.com');
session_start();
suhosin.session.cryptdocroot=Off
suhosin.cookie.cryptdocroot=Off