我们通过添加以下代码行修复了浏览器无法登录子域的问题。
ini_set('session.cookie_domain', '.'.get_domain('http://'.$_SERVER['SERVER_NAME']));
get_domain函数获取网站的域名,以便“sub.sub.domain.com”返回“domain.com”。我们前置一个“。”这样我们的会话在所有子域中都很好。
修复了无法登录的问题,但现在的问题是,自从我们添加了这行代码后,我们将 随机 无法登录,因为会话未创建,只是NULL。
我随意说,因为我无法弄清楚是什么导致了它。有一天用户可以登录,他们会尝试第二天登录,但不起作用。清除cookie通常可以解决问题。知道我可能做错了什么吗?我已经尝试使用谷歌搜索,但没有找到任何有帮助的东西,我们的用户感到沮丧,我的想法已经不多了。任何帮助都非常感谢。
答案 0 :(得分:1)
清除Cookie通常可以解决问题。
看起来我有一个缓存问题,但这只是一个假设。
仅从您的描述中就很难判断问题出在浏览器端还是服务器端。
我可以给你的最佳建议是在登录表单上实施cookie测试。在用户实际输入他/她的凭据之前,您需要设置测试Cookie并使用其他test
get参数重定向到同一页面。如果使用此附加test
参数请求页面,则会检查测试cookie是否已成功设置。
只有在测试通过后才允许登录。否则,请提供错误消息并告知用户有关技术问题。
这可以帮助您确定问题何时实际发生。此外,如果出现可能有助于您调试问题的错误,您甚至可以从服务器端添加更多信息。
答案 1 :(得分:1)
只是为了排除它,请尝试使用常量字符串设置域,而不是使用get_domain()
这样的内容来推导它:
ini_set('session.cookie_domain', '.foo.com');
在浏览器中查看.foo.com
上设置的Cookie以及sub.foo.com
上可能设置(或设置)的任何旧Cookie
我看到了一些类似于你所描述的问题,因为某些cookie不能被不同的服务器看到。问题在于,sub.foo.com
可能已经定义了一个cookie条目,你没有删除它,只有它才能看到它。由www.foo.com
上的.foo.com
设置新Cookie,因为www.foo.com
无法看到sub.foo.com
Cookie。
我希望这是有道理的......
答案 2 :(得分:0)
事实证明,我忘了在其中一个标题中改变这个设置,这些标题让所有事情都失控了。
(很抱歉回答我自己的问题,请大家投票帮忙)