在php中的子域上共享会话


Share session on subdomains in php

我在两个子域之间共享会话时遇到问题,我在这里和其他地方读了很多线程。

我有www.xx.com和sub.xx.com,我已经设置了

session_name("PHPSESSXX");
session_set_cookie_params(0, '/', '.xx.com');

并且session.save_path在两个域上都是相同的。

我在两个域上都得到一个名为PHPSESSXX的cookie,它的值相同。

当我登录www.xx.com时,我会得到一个包含一些详细信息的会话,它一直保持这种状态,直到我转到sub.xx.com。然后sub.xx..com上的会话是空的,如果我刷新www.xx.com,那里的会话也会消失。所以它做了一些事情,但每次我访问不同的子域时,它似乎都会覆盖会话数据。

有什么想法吗?-我能以某种方式调试它吗?

顺便说一句:我在两个域上都使用ssl。

欢呼

PHP会话ID保存在Cookie中。要使cookie在所有子域中可用,您需要将其分配给根域。然后所有子域都会从cookie中获得会话id,PHP可以使用传递的会话id找到会话。

事实证明,您只需要在php.ini文件中将session.cokie_domain设置为根域

session.cookie_domain=".example.com"还可以查看手册中用于设置ini条目的不同方法。

您的问题在这里得到回答

在多个子域之间共享SESSION变量

我的解决方案是在.htaccess中设置一个标志,如下所示:

php_flag "suhosin.session.cryptdocroot" 0

现在它运行得很完美;o)

问题是系统上安装了Suhosin,并且ini变量

suhosin.session.cryptdocroot = On

以这样一种方式加密会话文件,当不同的子域试图更改会话时,出于安全原因,它会删除所有内容。

在ini文件中将变量设置为Off或nothing对我来说不起作用,尽管可能我没有找到合适的文件。

我还试着用PHP设置它,但没有成功。像这样:

ini_set('suhosin.session.cryptdocroot', 0)

欢呼