首頁 >後端開發 >php教程 >Yii2下session跨網域共存的解決方案

Yii2下session跨網域共存的解決方案

高洛峰
高洛峰原創
2017-02-06 16:57:351424瀏覽

前面談過session相關配置,在開發的時候,常需要跨域共用session的是登錄模組,我相信很多開發的朋友的都遇到過,只需要一個地方登錄,相關聯的網站也是處於登錄狀態。兩種情況:一種9streets.cn和a.9streets.cn之間,另一種是a.com b.com之間,這幾天總結了一下處理方法。

無論是一二級域名,和不同域名下的跨域,無非要達到兩點:

客戶端訪問同一個sessionId,

所有域名對應的伺服器訪問的session的數據的位置必須一致。

1.訪問共同的sessionId主要是透過把目前的sessionId寫進cookie裡面

cookie在不同網域下是無法存取的,我們需要在存取在後台設定使用者在登入的時候,把需要共用的登入資訊的域名,如果是在1,2級域名下,直接把cookie設定為所屬主域名,例如:

setcookie("session_id",session_id(),time()+3600*24*365*10,"/",".a.com");

也許你會問:如果是在不同的域名呢?採用P3P技術簡單解決,實現原理,在訪問網站x.com的時候,y.com程序觸發y.com文件的寫入sessionid值,sessionid值便可以獲取,然後把seesion值存入數據庫,取相同的sessionid值便可。這就要求y.com裡面的程式檔案必要能跨網域存取,預設情況下,瀏覽器是不能跨網域設定cookie的,加上p3p頭後才行。在對應php檔案加上:header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');

2.session資料儲存位置一致的實作方法資料儲存位置一致的實作方法資料儲存位置一致的實作方法資料儲存位置一致的實作方法資料儲存位置一致的實作方法資料儲存位置一致的實作方法資料儲存位置一致的實作方法資料儲存位置一致的實作方法資料儲存位置一致的實作方法資料儲存位置一致的實作方法資料儲存位置一致的實作方法資料儲存位置一致的實作方法資料儲存位置一致的實作方法資料儲存位置一致的實作方法

session該資料預設情況下是存放在伺服器的tmp檔案下的,是以檔案形式存在,而非儲存在伺服器的記憶體中,在這裡我們得修改為所有網域下都能存取的方式。網路上介紹了資料庫存儲,文件形式存儲,內存存儲, 如果用資料庫存儲session數據,網站的訪問量很大的話,SESSION 的讀寫會頻繁地對數據庫進行操作,效率就會明顯降低,可以考慮存在內存伺服器來實現,下面的session.rar裡面介紹的是資料庫存session的實例。

在yii2下處理這中問題,根據網上搜到的教程最終配置成功教程如下:

在frontend的config資料夾中main.php中設定

$host = explode('.', $_SERVER["HTTP_HOST"]);
if (count($host) > 2) {
  define('DOMAIN', $host[1] . '.' . $host[2]);
} else {
  define('DOMAIN', $host[0] . '.' . $host[1]);
}
define('DOMAIN_HOME', 'www.' . DOMAIN);
define('DOMAIN_USER_CENTER', 'man.' . DOMAIN);
define('DOMAIN_API', 'api.' . DOMAIN);
define('DOMAIN_EMAIL', 'mail.' . DOMAIN);
define('DOMAIN_LOGIN', 'login.' . DOMAIN);
define('DOMAIN_IMG', 'img.' . DOMAIN);

然後設定User 和Session設定

'user' => [
  'enableAutoLogin' => true,
  'identityCookie' => ['name' => '_identity', 'httpOnly' => true, 'domain' => '.' . DOMAIN],
],
'session' => [
  'cookieParams' => ['domain' => '.' . DOMAIN, 'lifetime' => 0],
  'timeout' => 3600,
],


這裡在配置項的user和session裡我把domain寫死了例如:'domain'=>'.baidu.com',這樣就不用判斷了.

以上就是本文的全部內容,希望對大家的學習有幫助,也希望大家多多支持PHP中文網。

🎜更多Yii2下session跨網域共存的解決方案相關文章請關注PHP中文網! 🎜
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn