我有一个运行两个子域的网站,这两个子域都需要登录(基于相同的数据库访问凭据)。为了方便用户,我想更改它,以便他们可以导航两个子域而无需单独登录:基本上,他们登录其中一个子域,然后可以在一个子域之间自由导航。
我在Allow php sessions to carry over to subdomains找到的一个解决方案涉及将session.cookie_domain变量更改为所有子域将共享会话变量,但似乎有些错误。我仍然可以在subdomain1上登录并导航它,但是一旦我从subdomain2加载一个页面,subdomain1立即丢失所有会话数据,然后我被带回登录页面。这也是相反的方式(首先从subdomain2登录)。在更改之前,子域可以同时登录,但他们不会“看到”彼此。
可能导致此问题发生的原因是什么?
答案 0 :(得分:8)
我怀疑是suhoshin project的session encryption feature,这个补丁集包含在大多数基于debian的系统中。它可以配置为使用从各种源生成的密钥对会话文件的内容进行编码,以保护会话内容免受在同一台计算机(共享主机)或会话劫持上运行的其他php脚本的影响。其中一个来源是docroot(默认情况下已启用),每个子域通常都有所不同。
一个简单的phpinfo()
会报告扩展程序及其设置,查找名为suhosin
及其下方的块,看看suhosin.session.encrypt
和suhosin.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”本地值。