PHP会话正在子域之间重置

时间:2012-07-25 15:45:12

标签: php session session-cookies

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

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

可能导致此问题发生的原因是什么?

1 个答案:

答案 0 :(得分:8)

我怀疑是suhoshin projectsession encryption feature,这个补丁集包含在大多数基于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”本地值。