正在子域之间重置PHP会话

正在子域之间重置PHP会话,php,session,session-cookies,Php,Session,Session Cookies,我有一个运行两个子域的网站,这两个子域都需要登录(基于相同的DB访问凭据)。为了方便用户使用,我想对其进行更改,以便他们可以在两个子域之间导航,而无需单独登录:基本上,他们可以在其中一个子域上登录,然后可以在其中一个子域和另一个子域之间自由导航 我在中找到的一个解决方案是将session.cookie\u域变量更改为,以便所有子域都共享会话变量,但似乎有点不对劲。我仍然可以在subdomain1登录并导航它,但只要我从subdomain2加载一个页面,subdomain1就会立即丢失它的所有会话

我有一个运行两个子域的网站,这两个子域都需要登录(基于相同的DB访问凭据)。为了方便用户使用,我想对其进行更改,以便他们可以在两个子域之间导航,而无需单独登录:基本上,他们可以在其中一个子域上登录,然后可以在其中一个子域和另一个子域之间自由导航

我在中找到的一个解决方案是将session.cookie\u域变量更改为,以便所有子域都共享会话变量,但似乎有点不对劲。我仍然可以在subdomain1登录并导航它,但只要我从subdomain2加载一个页面,subdomain1就会立即丢失它的所有会话数据,我会被带回到登录页面。这也是另一种情况(首先从子域2登录)。在更改之前,子域可以同时登录,但它们不会“看到”彼此

是什么导致了这个问题的发生?

我怀疑是的,这个补丁集包含在大多数基于debian的系统中。它可以配置为使用从各种来源生成的密钥对会话文件的内容进行编码,以保护会话内容不受在同一台机器上运行的其他php脚本(共享主机)或会话劫持的影响。其中一个源是(默认情况下启用的),它通常在每个子域上都不同

检查其是否已安装 一个简单的
phpinfo()
将报告扩展名及其设置,查找名为
suhosin
的块及其下方,查看
suhosin.session.encrypt
suhosin.session.cryptocRoot
是否处于启用状态

禁用加密 显然,如果您有权访问服务器,您可以编辑php.ini以禁用整个加密或仅禁用docroot部分

如果没有,并且服务器正在运行apache,请尝试在php应用程序根目录的
.htaccess
文件中禁用它,如下所示:

php_flag "suhosin.session.cryptdocroot" 0
如果它起作用,您应该可以看到phpinfo()输出中的差异。(本地值列)

如果您的主机不允许使用
.htaccess
文件,您可以在php中设置相同的变量,但在
会话\u start()
之前进行设置非常重要。希望您有某种前端控制器来放置它

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

phpinf的输出应与
.htaccess
方法中的cryptdocroot行相同,并带有一个“Off”本地值

您是否已检查(在Firebug或Chrome开发控制台等)浏览器中设置了哪些会话cookie?或者,如果您的会话cookie参数显式设置了cookie域,那么您的php安装是否具有suhosin补丁集?默认会话加密使用as加密密钥,因此当您尝试从第二个域访问会话文件时,它将无法解密。@Crontab:为两个子域设置的cookie完全相同。它们共享相同的值,并且它们的域被设置为“.com”。我注意到,即使在子域之间导航,cookie也保持不变,因此客户端浏览器似乎得到了它应该得到的东西。问题似乎是,每当我在子域之间移动时,服务器都会丢弃该会话ID的变量。它们是否仍使用相同的会话ID,还是正在更改?如果是,您可以在用户单击链接时尝试传递会话ID。然后,您可以明确地告诉它要使用哪个存储的会话。否,两个子域的会话ID保持不变。我相信complex857在这个问题上是正确的,因为子域具有不同的文档根,因此尝试从不同的子域打开当前会话可能会导致数据被删除。不过,我仍在研究一种可能的解决方法。首先,我尝试了
ini\u集('suhosin.session.cryptdocroot',0),这对我不起作用。然而,.htaccess方法完成了这项工作。谢谢你救了我的命。