子域上的PHPSESSID Cookie彼此之间存在冲突

时间:2013-11-06 13:42:59

标签: php cookies session-cookies sugarcrm

我们遇到一些PHP Session Cookies的问题,不允许我们登录我们的* SugarCRM **应用程序,这是一个开源的PHP应用程序。

问题是我们在2个子域上安装了相同的应用程序,如下所示......

主要网站
www.domain.com

开发网站
dev.www.domain.com

现在登录后,它将不允许您登录到另一个!

请查看下面的图片以查看Cookie问题...

enter image description here

在上图中,您可以看到有2个PHPSESSID Cookies竞争会话!

如果我现在删除其中一个,它允许我正常登录而没有问题!

因为这是SugarCRM,我希望我能解决这个问题,而不会对应用程序进行任何核心文件修改。但如果必须,那么我们会。

那么有没有人对一个好的解决方案有任何想法?

现在我的想法是一个“讨厌的脏黑客”,我真的不想这么做。它是在登录表单上创建一个按钮,这个按钮将使用JavaScript来清除/删除PHPSESSID Cookies,但我真的想找到一个合适的解决方案。

如果有任何想法,请分享?谢谢


更新
谢谢你到目前为止的答案。请注意,这不是我构建的简单PHP应用程序,我可以轻松地进行代码更改。这是SugarCRM,这是一个包含数千个文件的大型应用程序

5 个答案:

答案 0 :(得分:0)

尝试使用函数(http://php.net/manual/en/function.session-set-cookie-params.php):

  session_set_cookie_params ( $lifetime, $path, $domain, $secure, $httponly)

并设置一个$domain = '.domain.com'

或者,如果您通过setcookie手动设置会话Cookie,那么也设置相同的域

答案 1 :(得分:0)

尝试在子域

上设置.htaccess参数
php_value session.cookie_domain .domain.com

或在php代码中使用,但在“session_start()”之前使用

ini_set('session.cookie_domain', '.domain.com' );

答案 2 :(得分:0)

使用 session_set_cookie_params

在主域上设置子域的会话。

答案 3 :(得分:0)

它实际上不是您需要更改的域,而是“会话名称”(cookie参数的名称)。这两个应用程序似乎都使用默认的“phpsessid”,需要使其不同,否则应用程序将看到彼此的会话,查看错误的会话,或尝试反序列化仅在其他项目中定义的类。

您需要更改存储会话ID的cookie参数。它可以从环境变量(php.ini,.htaccess等)控制:http://us1.php.net/manual/en/session.configuration.php#ini.session.name

这样,您可以在同一个域上拥有多个PHP会话。例如,如果你有example.com/sugarcrmexample.com/foo你可以让sugarCRM将它的会话ID存储在名为“sugarsession”的cookie参数中(而不是默认的phpsessid)

答案 4 :(得分:0)

我遇到这个问题已经有一段时间但是我认为你要做的就是通过编辑每个SugarCRM文件系统中的config.php将每个实例会话文件写入不同的目录并更改行

'session_dir'=> '',

指向不同的目录。