2012-02-16 76 views
5

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

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

,并具有超链接“测试2”,这只是尝试呼应$ _SESSION [价值'测试']来证明它的工作,或不。我将'测试1'放在我的www域中,'测试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']设置为什么值。然而,上述方法之一应该起作用的'网络似乎有很多确定性。任何想法可能会发生什么,特别是因为我使用最小的页面来测试机制(没有副作用,我可以看到)?顺便说一下,我在共享服务器上,如果这是pertinant在这里。

谢谢你的想法。坦率。

编辑我修好了。问题是由Suhosin造成的。查看本页脚下的详细解答。

回答

5

好吧我钉它,这是一个臭气熏天。

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

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

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

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

+0

“一个48小时的恶梦追查,4.8秒修复” - 超级。我理解你 :) – qasanov 2012-12-26 09:40:56

0

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

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

谢谢。我尝试命名会话 - 没有喜悦。我现在确实有更多的信息。我尝试了php.net文档中建议的测试,并添加了以下内容:$ some_name = session_name(“some_name”); $ blnResult = ini_set(“session.cookie_domain”,“.mydomain.com”);在session_start(); if(empty($ blnResult)or(!$ blnResult)){echo“设置无法设置”;出口; }我发现返回结果表明它没有被设置!任何想法为什么这应该是? – Frankie 2012-02-16 19:29:27

+0

@Frank Anderson我没有尝试'ini_set'方法,只是'session_set_cookie_params'之一。 – jeroen 2012-02-16 23:02:05

+0

谢谢jeroen。我看到一个笨拙的错误,但现在我纠正了这一点,是的,我现在使用的设置完全按照您在这里所建议的。仍然会话变量的值不会转移到“接收”页面,只要它位于子域中即可。还有什么可以做的,或者我可以尝试其他什么诊断方法来试图弄清楚发生了什么? – Frankie 2012-02-17 00:21:46