2012-10-02 25 views
0

我运行一个网站,它可以通过不同的域到达后可供选择:domainname.de,domainname.ch,domainname.at,domainname.es等...PHP会话有时不能传递到另一个域

当我的客户想要支付我们的付款页面,当然这是https保护。由于服务器的限制,我只能拥有一个SSL证书,我只能将其放在一个域名中:domainname-secure.com。

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

然后我检查我采取$_GET['session_id']和运行后续命令对domainname-secure.com提供的会话:

session_id($_GET['session_id']); 

session_start(); 

当我测试它自己,它工作完全正常,但我做一个日志当有人进入domainname-secure.com并且没有设置$_SESSION['domain_default']时输入。

这种情况每天发生几次,但我真的不知道为什么这样做不起作用!我从很多不同的链接一次又一次地测试它,但对我来说它工作得很好。

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

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

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

+0

您的服务器设置是否包含suhosin补丁集? – complex857

+0

为什么不直接将域添加到数据库中的用户?那么你不需要这个不必要的复杂设置。 – jeroen

+1

@jeroen他想要获取他存储在'$ _SESSION'中的数据。这就是为什么他通过get来传递session_id。我假设他从原始域以外的'$ _SESSION'变量获得了一些其他信息。否则,他可以将域名放在'$ _GET'参数中。 –

回答

2

会话由PHP按每个域的管理这意味着它们不会有意混合使用域。

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

有两种方法,如果你想改变域的时候能够访问会话信息之一:

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

或者:

  • 使用PHP的$ _SESSION,而是从一个域转移到另一个序列化时,在$ _SESSION中的数据,并把它从某个地方像SQL两个域的访问;
+0

SESSION谢谢你的回答。但是,这不就是为什么session_id可以通过get参数来传递(除了可以禁用cookie的事实)以解决这个限制吗? – Freddy

+1

不,这就是为什么*即使您通过$ _GET传递session_id,您将无法访问其他域会话文件 - 它们是分开的。 –

+0

但它适用于我..我只收到错误消息,它不适用于其他人。这不是浏览器相关的,是吗? – Freddy

相关问题