PHP会话正在子域之间重置


PHP session is getting reset between subdomains

我有一个网站运行着两个子域,这两个子域都需要登录(基于相同的数据库访问凭据)。为了让用户更容易,我想更改它,这样他们就可以导航两个子域,而不必单独登录:本质上,他们在其中一个子域登录,然后可以在一个子域和另一个子域之间自由导航。

我在"允许php会话转移到子域"中找到的一个解决方案是将session.cokie_domain变量更改为,以便所有子域共享会话变量,但似乎有问题。我仍然可以在子域1登录并导航,但一旦我从子域2加载页面,子域1就会立即丢失所有会话数据,我会被带回登录页面。这种情况也会反过来发生(首先从子域2登录)。在更改之前,子域可以同时登录,但它们不会"看到"彼此。

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

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

检查是否已安装

一个简单的phpinfo()将报告扩展及其设置,查找名为suhosin和以下的块,查看suhosin.session.encryptsuhosin.session.cryptdocroot是否在上

禁用加密

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

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

php_flag "suhosin.session.cryptdocroot" 0

如果它有效,您应该看到phpinfo()输出中的差异。(本地值列)

如果您的主机不允许.htaccess文件,您可以在php中设置相同的变量,但在session_start()之前进行设置很重要。希望你有某种前端控制器来放置这个。

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

phpinf的输出应该与.htaccess方法中相同,cryptdocroot行具有"Off"本地值。