如何在两个不同的域中共享PHP会话



好吧,它来了。

我的客户最近为 domain1.net 购买了SSL证书。几周后,他买下了 domain1.com,他认为这更好。

现在,他想使用该 domain1.com 但我无法将证书从 domain1.net 移动到 domain1.com,因为这样做的时间已过期。

因此,客户在 domain1.com 中导航,当他需要登录或输入信用卡信息时,我重定向到 https://domain1.net。但是我需要在这 2 个域之间共享 PHP $_SESSION。

我该怎么做?有什么想法吗?谢谢!

您可以将会话数据放入缓存中,这两个域都应该可以访问该缓存(不确定后台有多少台服务器),然后在重定向发生后从缓存中检索会话数据。

我认为

您使用 _SESSION 美元的功能几乎不走运。 问题是您将无法在两个不同的域之间传递会话 ID cookie(您可以通过控制 cookie 域在两个子域之间传递)。 您可以尝试在查询字符串中传递会话 ID,但谁想这样做。

您可以实现自己的后端逻辑来存储两个域共有的信息,但我认为这需要您自己的令牌系统在域之间来回移动时对用户进行身份验证以替换会话 ID 替换。

您最好的选择是告诉您的客户他需要在.com域上购买证书。 要么这样,要么他可以向您支付更大的金额来构建您自己的自定义伪会话系统。

你不能那样做,(感谢上帝)。

您必须找到另一种交换数据的方法:

  • 也许这两个站点在同一台服务器上,并且可以访问公共目录。 例如,/tmp,这也是默认会话文件所在的位置。
  • 如果不在同一台服务器上,请使用 ftp、http 或其他协议来交换数据。

当然,最简单的解决方案是购买一个新证书(每年几美元)并将站点合并在一起。

这里还有很长的路要走

在两个域中创建一个php文件(share.php),如下所示,数据通过此方法共享

<?php session_start();
echo json_encode($_SESSION);
?>

现在在另一个域上创建另一个文件,最好用作包含文件以接收会话数据

<?php session_start();
$abc = file_get_contents('http://domain1.com/share.php');
$obj = json_decode($abc);
print_r($obj);
?>

print_r将以这种方式显示另一台服务器的整个会话数据。使用对象和数组的组合来访问所有元素。如果需要覆盖此服务器的会话,请使用此代码而不是print_r

<?php
foreach($obj as $key => $value){
$_SESSION[$key] = $value;
}
?>

您需要会话数据还是一些登录信息?在任一情况下,您都可以序列化 $_SESSION (http://php.net/manual/en/function.serialize.php) 或根据需要将其存储在数据库中。添加一个主键和一个"秘密"字段,你可以用 rand(0,1000000000) 填充;

然后,当您链接到网站时,传递主密钥和密钥号,并使用它来从数据库中获取会话信息。

最新更新