0

我运行一个可以通过不同域访问的网站:domainname.de、domainname.ch、domainname.at、domainname.es 等。

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

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

然后,我检查$_GET['session_id']并运行以下命令以使会话在 domainname-secure.com 上可用:

session_id($_GET['session_id']);

session_start();

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

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

你们中的一些人能想象为什么它有时不起作用吗?

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

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

4

1 回答 1

2

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

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

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

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

或者:

  • 使用 PHP 的 $_SESSION,但是当从一个域传输到另一个域时,将 $_SESSION 中的数据序列化,并将其放在两个域都可以访问的地方,例如 sql;
于 2012-10-02T14:36:52.800 回答