2012-05-18 47 views
0

對於初學者,我們使用Yii框架來創建我們的網站,並且它正在處理cookies的創建。如何解決特定子域中的衝突會話Cookie?

我們有一個網站有許多子域名,所以主要網站有一個會話cookieParams的「.sitename.com」。

事情是這樣的:

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

我們有www,ab共享相同的會話cookie,這很好。

但是,我們有一個具有不同用戶系統和登錄機制的特殊管理子域,所以我們有一個單獨的會話cookieParam「admin.sitename.com」。

問題是,如果有人從主站點獲得會話cookie,則登錄管理站點將失敗,因爲主站點的「.sitename.com」cookie似乎優先。刪除主站點的cookie會暫時修復問題,直到瀏覽器再次訪問主站點。

有沒有辦法解決這個問題,還是有更好的方法來設置Cookie域?

謝謝!

+1

爲什麼你不能讓管理網站使用不同的cookie名稱? –

回答

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', 
     ), 
     ... 
    ), 
); 
+0

會話ID名稱也對我有幫助。帶有domain.com的PHPSESID和帶有.domain.com的另一個cookie都是允許的。並且都導致了yii的完全崩潰,這是沒有以任何其他方式診斷的。直到我更改了cookie名稱本身。最後!謝謝。 – thevikas

2

最簡單的解決方案是使用不同的會話名稱。在普通的PHP中,你可以在session_start()之前調用session_name()。我對Yii框架不是很熟悉,但類CHttpSession似乎是PHP函數的一個簡單包裝,它有一個setSessionName()方法。