跨多个域共享php Session($ _SESSION)

时间:2011-09-07 02:18:41

标签: php codeigniter symfony1

我有2个不同的域名,我们称之为www.foo.com和bar.foo.com。第一个是用CI构建的,第二个是用Symfony构建的。我想分享我的会话,所以如果我登录其中一个,我可以访问另一个。我使用$_SESSION["session_name"] = "value";设置会话数据。

如何使会话数据可以从其他域读取?

感谢您的帮助。

5 个答案:

答案 0 :(得分:3)

在我理解的原始问题的评论中考虑您的原始问题以及您对Logan和我的回答:

1 - 您希望在域及其子域之间传递会话变量;和

2 - CI和Symfony在您有机会执行ini_set命令之前加载会话。

我相信你有两个选择:

1 - 在php.ini文件中包含php配置命令

session.cookie_domain=".foo.com"

如果你尝试将它包含在.htaccess中,那么如果你将php作为CGI模块运行它将无法工作,这在共享主机服务中似乎相当普遍。

2 - 您可以将文件添加到站点中的所有php脚本中。这些将被放在您的网站运行的每个PHP脚本之上,甚至是CI和Symfony中的那些。例如:

phpprepend.php文件

<?php
ini_set('session.cookie_domain', '.foo.com');
?>

在php.ini文件中包含以下行:

auto_prepend_file = "/path/to/file/phpprepend.php"

如果能解决问题,请告知我们。

祝你好运!

答案 1 :(得分:1)

使用session_name功能让他们拥有相同的会话名称。这适用于子域。 如果它们是完整的不同域,并且如果您使用cookie来传递会话ID,则这将不起作用,因为cookie仅适用于一个域。

答案 2 :(得分:0)

您需要设置会话Cookie的域名,以便可以从两个站点访问它。

<?php
ini_set('session.cookie_domain', '.foo.com');

要么在加载时尽早将其添加到两个站点的PHP代码中,要么将这样的内容添加到两个站点中的.htaccess文件中。

php_value session.cookie_domain ".foo.com"

我不是100%肯定第二种选择有效,但我认为应该这样做。

答案 3 :(得分:0)

会话与服务器中包含会话数据的实际文件相关联。因此,除非站点有共享这些临时会话文件的方法,否则它们无法共享会话。这是除非会话被序列化并发送到另一个站点。我认为唯一的解决方案是实现一个会话,该会话将会话数据存储并存储在两个站点可以访问的外部数据库中。然后,如果server 1将会话ID发送到server 2并且server 2使用它来访问数据库,则它可以访问server 1

存储的会话数据

答案 4 :(得分:0)

代码点火器可以选择使用它session library,它支持存储你的会话是一个数据库,可能有某种形式的插件,或者你可以建立自己的,为symphony可以读取代码点火器数据库之外的会话,并在symphony中设置会话。

因此,虽然它们在技术上会是两个不同的会话,但数据库会同步它们。

这当然假设您的两个站点使用相同的数据库。