天天看點

多DZ和UC同步登陸狀态(支援HTTPS,PHP7.4.3)

前端時間一個QQ上找到我的朋友求助在HTTPS下實作使用者在多個DZ同步退出登陸狀态,我摸索了一下 整理出了修改方法。

2020年3月16日更新:

本文釋出一年了,最近有朋友反應使用最新版的DZ(Discuz_X3.4_SC_UTF8【20191201】)使用本修改辦法無法同步登陸退出狀态,我檢視後發現按本文方法修改後還需要新增一些修改,近期我會将最新的修改步驟更新上來,請持續關注本文更新!

關于最新版的DZ同步登陸退出效果示範請在我的示範站體驗測試

https://forum.ue4.net

https://club.ue4.net

以上兩個均為最新的 Discuz_X3.4_SC_UTF8【20191201】

本文由 www.UE4.net 原創提供 黃韬 QQ:95606117,轉載請注明

該朋友通過一套UC整合了十幾個DZ論壇,使用我提供的修改方法完美實作所有DZ同步登陸退出狀态,将此方法分享在此

環境: CentOS 7.4 寶塔面闆(nginx1.15+php7.3+MySQL7.5)SSL證書使用的是寶塔版面裡申請的Let’s Encrypt免費證書,開啟了強制HTTPS通路

程式 Discuz X3.4 UTF-8 Ucenter1.6.0

建議獨立安裝Ucenter,不要使用DZ裡的UC

開始那位朋友使用的是DZ裡帶的UC,也可以修改成功,修改方式略有不同

後來先将UC獨立安裝好後,再安裝DZ的

**安裝Ucenter前修改 **

請将Dicsuz安裝包中的uc_server目錄下除 install目錄 外的所有目錄和檔案,複制覆寫到UCenter根目錄中

此處是因為DZ3.4中的UC官方為了支援HTTPS,一些地方進行過修改,而獨立下載下傳的UC1.6并未進行這些修改更新,不能很好的支援HTTPS

開始修改

avatar.php

大約行25

define('UC_API', strtolower(($_SERVER['HTTPS'] == 'on' ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/'))));
           

修改成

define('UC_API', strtolower(($_SERVER['SERVER_PORT'] == 443 || $_SERVER['HTTPS'] == 'on' ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/'))));
           

安裝好後登陸Ucenter 檢查一下以下設定

應用管理 - 每個應用的 編輯 - 是否開啟同步登入: ‘是’

應用管理 - 每個應用的 編輯 - 是否接受通知:: ‘是’

安裝Discuz前修改

install/index.php

大約行137

/^(http:\/\/)/i
           

修改為

/^(https:\/\/)/i
           

install/index.php

大約行 485

<iframe frame width="700" height="550" allowTransparency="true" src="http://addon.discuz.com/api/outer.php?id=installed&siteurl='.urlencode($default_appurl).'&version='.DISCUZ_VERSION.'"></iframe>
           

修改成

安裝成功
           

install/include/install_function.php

大約行870 找到

$port = !empty($matches['port']) ? $matches['port'] : ($matches['scheme'] == 'https' ? 443 : 80);
           

在其下行加入以下代碼

if($scheme=='https'){
   $curl = curl_init();
   curl_setopt($curl, CURLOPT_URL, $url);
   curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
   if($post) {
      curl_setopt($curl, CURLOPT_POST, 1);
      curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
   }
   if($cookie) {
      curl_setopt($curl, CURLOPT_COOKIE, $cookie);
   }
   curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
   curl_setopt($curl, CURLOPT_HEADER, 0);
   curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
   //如安裝提示錯誤資訊:SSL certificate problem: unable to get local issuer certificate
   //請将以下兩行‘//’删除
   //curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
   //curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
   $return = curl_exec($curl);
   if (curl_errno($curl)) {
      echo '<pre><b>錯誤:</b><br />'.curl_error($curl); 
   }
   curl_close($curl);
   return $return;
}
           

source/class/discuz/discuz_application.php

大約行190

$_G['isHTTPS'] = ($_SERVER['HTTPS'] && strtolower($_SERVER['HTTPS']) != 'off') ? true : false;
           

修改成

$_G['isHTTPS'] = ($_SERVER['SERVER_PORT'] == 443 || $_SERVER['HTTPS'] && strtolower($_SERVER['HTTPS']) != 'off') ? true : false;
           

行192

$_G['siteurl'] = dhtmlspecialchars($_G['scheme'].'://'.$_SERVER['HTTP_HOST'].$sitepath.'/');
           

修改成

$_G['siteurl'] = dhtmlspecialchars('http'.($_G['isHTTPS'] ? 's' : '').'://'.$_SERVER['HTTP_HOST'].$sitepath.'/');
           

source/class/class_member.php

大約行922 找到

$href = str_replace("'", "\'", $url_forward);
           

在其下行增加以下代碼

$ucsynlogin = $this->setting['allowsynlogin'] ? uc_user_synlogin($_G['uid']) : '';
           

source/class/class_member.php

大約行931

'</script>',
           

修改成

'</script>'.$ucsynlogin,
           

完成以上Discuz的修改後 開始安裝Discuz

安裝完成後登陸DZ管理背景,做如下設定

1.防灌水 - 驗證設定 - 登入時啟用驗證碼 :選擇‘不啟用’

2.站長 - UCenter 設定 - 是否允許其他應用的會員在站點激活:選擇‘是’

3.站長 - UCenter 設定 - 是否允許直接激活:選擇‘是’

如有多套DZ,每套DZ程式均需按以上步驟修改

最後

将Ucenter站點中data/cache/apps.php中的所有代碼複制覆寫到到DZ目錄

uc_client/data/cache/apps.php檔案中(如有多套DZ,請在所有DZ安裝完成後執行此步驟,每套DZ都需複制一份過來)

完成以上步驟後,即可做到多套DZ上使用者可同步登陸退出狀态.如果各位在修改中遇到什麼問題可按本文最後提供的聯系方式交流學習。

本文由 www.UE4.net 原創提供 黃韬 QQ:95606117,轉載請注明

繼續閱讀