Stories

Detail Return Return

解決ThinkPHP系列多域名二級域名單點登錄問題 - Stories Detail

前言

曉傑的軟件接口平台有多個域名,還有多個網站共用一個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 曉傑

user avatar tpwonline Avatar yixiyidong Avatar bytebase Avatar
Favorites 3 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.