4

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

我在允许 php 会话转移到子域中找到的一种解决方案涉及将 session.cookie_domain 变量更改为,以便所有子域共享会话变量,但似乎有问题。我仍然可以在 subdomain1 登录并导航它,但是一旦我从 subdomain2 加载页面,subdomain1 就会立即丢失其所有会话数据,并且我会返回登录页面。这也反过来发生(首先从 subdomain2 登录)。在更改之前,子域可以同时登录,但它们不会“看到”对方。

什么可能导致此问题发生?

4

1 回答 1

8

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

检查是否安装

一个简单phpinfo()的将报告扩展名和它的设置,在下面查找一个名为suhosinand 的块,看看它suhosin.session.encrypt是否suhosin.session.cryptdocroot打开

禁用加密

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

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

php_flag "suhosin.session.cryptdocroot" 0

如果它正常工作,您应该会看到 phpinfo() 输出的差异。(局部值列)

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

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

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

于 2012-07-25T19:48:10.660 回答