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

时间:2012-05-18 22:33:56

标签: php session cookies yii

对于初学者,我们使用Yii框架来创建我们的网站,它正在处理cookie的创建。

我们有一个包含多个子域的网站,因此主网站的会话cookieParams为“.sitename.com”。

这样的事情:

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

我们有wwwab来共享相同的会话Cookie,这非常有用。

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

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

有没有解决方法,还是有更好的方法来设置Cookie域?

谢谢!

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

在使用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',
        ),
        ...
    ),
);