PHP会话正在子域之间重置

Sil*_*len 4 php session session-cookies

我有一个运行两个子域的网站,这两个子域都需要登录(基于相同的数据库访问凭据).为了让用户更容易,我想改变它,使他们能够浏览这两个子域,而无需分别登录:基本上,他们在其中一个子域登录,就可以自由地一侧和另一之间进行导航.

我发现在允许php会话转移到子域的一个解决方案涉及将session.cookie_domain变量更改为所有子域将共享会话变量,但似乎有些错误.我仍然可以在subdomain1上登录并导航它,但是一旦我从subdomain2加载一个页面,subdomain1立即丢失所有会话数据,然后我被带回登录页面.这也是相反的方式(首先从subdomain2登录).在更改之前,子域可以同时登录,但他们不会"看到"彼此.

什么可能导致这个问题发生?

com*_*857 8

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

检查是否已安装

一个简单的phpinfo()将报告的延伸和它的设置,寻找名为块suhosin和低于看看是否suhosin.session.encryptsuhosin.session.cryptdocroot

禁用加密

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

如果你不这样做,并且服务器正在运行apache,请尝试在.htaccessphp应用程序的root文件中禁用它,如下所示:

php_flag "suhosin.session.cryptdocroot" 0
Run Code Online (Sandbox Code Playgroud)

如果它工作,你应该看到phpinfo()输出的差异.(本地值列)

如果您的主机不允许.htaccess文件,您可以在php中设置相同的变量,但重要的是之前要做到这一点session_start().希望你有一种前置控制器来放置它.

ini_set('suhosin.session.cryptdocroot', 0);
phpinfo();
Run Code Online (Sandbox Code Playgroud)

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