我在两个不同的Web服务器上安装了自制CMS。每个都保持相同的代码。当我尝试在不同域之间传递$_SESSION
变量时,我遇到了一个非常烦人的问题。
我的CMS在domain1.com上。它控制的网站在domain2.com上。我的系统通过url链接将登录信息的所有会话变量从domain1.com传递到domain2.com(domain1.com有这样的链接:http://domain2.com?sessionId=1gh...
)(sessionId由session_id()生成)。 domain2.com检索会话ID并执行session_id($_GET['sessionId'])
设置会话并获取变量。然后它会在管理员功能的顶部显示一个栏。
此系统适用于我的某个主机以及我的localhost。但是我最近转移到另一台主机并使用相同的代码安装了我的CMS并取得了成功。除此功能外,一切正常。当我单击链接并尝试设置session_id时,session_id会更改,但$_SESSION
变量将被删除。当我回到我的CMS时,我必须重新登录。不知何故,在这台主机上,更改session_id会删除$_SESSION
变量。
我从来没有喜欢会话变量,如果我再次开始我就不会使用它们(我可能会使用普通的cookie)。但我真的需要弄清楚这一点。它运行的主机是Bluehost,两个域都由Bluehost托管。它不能使用的主机是[编辑] ByteHost,域名注册商是Godaddy。
以下是来自domain2.com的一些示例代码:
...
if ( $_GET['sessionId'] )
{
session_id($_GET['sessionId']);
}
session_start();
echo session_id(); // returns the proper sessionId passed through the url
print_r($_SESSION); // does not work. returns array()
...
我可以保证之前存在$_SESSION
个变量,因为我仍然登录了我的CMS。
任何想法为什么会话变量在1个主机上工作,而在另一个主机上不工作?
我尝试用工作主机替换php.ini文件。问题仍然存在。
感谢您的时间!
更新
我最终从我的CMS中删除了这个。现在,我只是通过网址传递登录详细信息,然后将此人记录下来。它的工作方式更加清晰。
答案 0 :(得分:3)
以下是一些可能无法正常工作的原因:
以下是我的建议:停止这样做。这是修复代码中非常严重的安全漏洞的绝佳机会。当您使用托管服务提供商进行诊断时,您可能只需使用HTML5存储或安全cookie重写您需要的所有内容。
我的猜测是托管服务提供商足够聪明,可以保护从其他域名被盗的会话信息。但在任何一种情况下,我强烈建议您更改代码,以便它不需要从其他域窃取会话信息。
答案 1 :(得分:0)
要在多个域上建立会话,您需要在网址而不是会话Cookie中传递会话ID,因为Cookie仅适用于单个域。
如果子域名不是单独的客户a.domain.com and b.domain.com