如何解决特定子域上冲突的会话 Cookie


How do I resolve conflicting session cookies on specific subdomain?

首先,我们使用Yii框架来创建我们的网站,它正在处理cookie的创建。

我们有一个包含许多子域的站点,因此主站点具有".sitename.com"的会话cookieParams。

像这样:

  • www.sitename.com
  • a.sitename.com
  • b.sitename.com
  • admin.sitename.com

我们有wwwab来共享同一个会话cookie,这很好用。

但是,我们有一个

特殊的管理子域,它具有不同的用户系统和登录机制,因此我们有一个单独的会话cookieParam"admin.sitename.com"。

问题是,如果有人从主站点获取会话 cookie,则登录管理站点将失败,因为主站点的".sitename.com"cookie 似乎优先。删除主站点的 Cookie 可以暂时解决此问题,直到浏览器再次访问主站点。

没有办法解决这个问题,或者有更好的方法来设置 cookie 域?

谢谢!

最简单的解决方案是使用不同的会话名称。在普通 php 中,您在 session_start(( 之前调用 session_name((。我对Yii框架不是很熟悉,但是类CHttpSession似乎是php函数的薄包装器,它有一个setSessionName((方法。

在检查yii如何使用他们的gii工具实现这一目标后,我在config.php中设置了以下内容并使其正常工作。

<?php 
$config = array(
    ...
    'components'=>array(
        ...
        'user'=>array(
            // enable cookie-based authentication
            'allowAutoLogin'=>true,
            'class' => 'WebUser',
            // Create a custom key prefix for the user cookie
            'stateKeyPrefix'=>'customkey',
        ),
        ...
        'session' => array (
            // Provide a custom name for the session id to differentiate it 
            // from the default PHPSESSID
            // Cannot use dots in the session id :(
            'sessionName' => 'custom_session_id',
            // Keep session stored in db for use accross load balancer
            'class' => 'system.web.CDbHttpSession',
            'connectionID' => 'db',
        ),
        ...
    ),
);