传递到另一个域后,php会话有时不可用

时间:2012-10-02 14:32:43

标签: php session ssl

我运营的网站可以通过不同的域名访问:domainname.de,domainname.ch,domainname.at,domainname.es等......

当我的客户想要付款时,我们会进入支付页面,当然这是https安全的。由于服务器的限制,我只允许使用一个SSL证书,我只将其放在一个域名:domainname-secure.com。

因为我收取不同的价格,我需要知道用户所属的域名,所以当重定向到domainname-secure.com时,我将域名(例如domainname.de)保存在会话变量$_SESSION['domain_default']中并传递sessionID通过添加session_id=[session_id]作为get参数。

然后我检查我是否$_GET['session_id']并运行follow命令以在domainname-secure.com上提供会话:

session_id($_GET['session_id']);

session_start();

当我自己测试它时,它工作得非常好,但是当有人访问domainname-secure.com并且没有设置$_SESSION['domain_default']时,我会创建一个日志条目。

这种情况一天发生几次,但我真的不知道为什么这不起作用!我从许多不同的链接一次又一次地测试它,但对我来说它完全正常。

有些人可以想象为什么它有时不起作用?

将会话ID传递给另一个域是不是“好”或不安全,重定向后它是否总是可读?

我知道你很难阻止一个错误,但是我正在寻找一些关于会话的知道问题,或者可能会提示如何以更好的方式做到这一点?

1 个答案:

答案 0 :(得分:2)

会话由PHP以每个域进行管理,这意味着他们不会故意混合域。

如果您要使用其他会话存储机制,例如写入数据库或使用memcached会话,您将能够克服此限制。

如果您希望在更改域时能够访问会话信息,则有两种方法:

  • 不要使用PHP的$ _SESSION,使用memcached / redis / sql设置自己的会话管理;

或者:

  • 使用PHP的$ _SESSION,但是当从一个域转移到另一个域时序列化$ _SESSION中的数据并将其放在可从两个域访问的地方,如sql;