這篇文章主要介紹了Yii2下session跨域名共存的解決方案,內容挺不錯的,現在分享給大家,也給大家做個參考。
前面談過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中文網其他相關文章!