前言
曉傑的軟件接口平台有多個域名,還有多個網站共用一個TP系統,舊版接口平台是TP5,前不久新站點哈喲微信消息推送也用到了該系統,部署後發現,登錄後Cookie沒有生效,導致無法正常登錄!
排查問題
發現後端config.php配置文件配置了session作業域為:.svip8.vip 所以導致新域名hayo.cn的cookie無效,問題找到就好解決了,曉傑想着如何能兼容多個域名並且支持其二級域名共用cookie實現單點登錄。
代碼
目前僅針對TP5修改
config.php
'session' => [
'id' => '',
// SESSION_ID的提交變量,解決flash上傳跨域
'var_session_id' => 'svip8',
// SESSION 前綴
'prefix' => 'SOUJER_',
// 驅動方式 支持redis memcache memcached
'type' => 'redis',
// 是否自動開啓 SESSION
'auto_start' => true,
'domain' => array('svip8.vip','hayo.cn'),
'expire' => 18000,
],
將多個頂級域名配置到domain中
修改:thinkphp/library/think/Session.php 文件第74行
if (isset($config['domain'])) {
//兼容CDN獲取當前請求域名
$host= isset($_SERVER['HTTP_X_FORWARDED_HOST'])?strtolower($_SERVER['HTTP_X_FORWARDED_HOST']):strtolower($_SERVER['HTTP_HOST']);
$domainArr = $config['domain'];
if(is_array($domainArr)){
foreach ($domainArr as $key => $val) {
if(strpos($host,$val)!==false){
ini_set('session.cookie_domain', ".".$val);
break;
}
}
}else{
if ($config['domain'] != ''){
ini_set('session.cookie_domain', ".".$config['domain']);
}else{
ini_set('session.cookie_domain',$config['domain']);
}
}
}
效果
完美解決該問題
優化
其實曉傑想過直接不用配置直接獲取當前host然後拿取該域名的頂級域名和"."拼接,看樣子也是不錯的方案,有啥不懂的問題可以直接問我!但是這並不能解決多域名單點登錄哦,多域名單點登錄的話建議使用header協議頭傳token或者使用nginx轉發等方案,這裏不多闡述。
本文作者
Soujer 曉傑