Discuz! 在 X3 之後才內建支援 https 協定
因為不想大幅度升級,所以決定以修改的方式讓 X2.5 版能支援 https 協定
花了不少時間追原始碼,初步修改後大致上可以同時使用 http 和 https 兩種協定進入論壇
使用 https 進入論壇時,論壇畫面、主題列表 都沒問題
但是點入文章後,很容易就被瀏覽器提醒 連線可能有安全漏洞
原因是論壇本就開放式架構,任何人張貼連外的連結或圖片或其他任何資源
只要連外不是使用 https 連結的,都會被視為不安全的連線
所以多數的論壇都維持使用 http 協定,頂多就是登入時使用 https 而已
既然已經修改了,就紀錄一下修改的方法
要修改的檔案如下
- 檔案:source/class/discuz/discuz_application.php
搜尋$_G = array(
(約110行),然後修改成如下
12345678global $_G;$_G = array('req_scheme' => array_key_exists('REQUEST_SCHEME', $_SERVER) ? $_SERVER['REQUEST_SCHEME']: ( $_SERVER['SERVER_PORT'] == 443 || (array_key_exists('HTTPS', $_SERVER) && strtolower($_SERVER['HTTPS']) != 'off') ? 'https' : 'http'),'uid' => 0,'username' => '','adminid' => 0,'groupid' => 1,
接著修改以下6個地方
123456789101112131415161718192021222324252627282930# 搜尋$_G['siteurl'] = dhtmlspecialchars('http://'.$_SERVER['HTTP_HOST'].$sitepath.'/');# 修改成$_G['siteurl'] = dhtmlspecialchars($_G['req_scheme'].'://'.$_SERVER['HTTP_HOST'].$sitepath.'/');# 搜尋setglobal('currenturl_encode', base64_encode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']));# 修改成setglobal('currenturl_encode', base64_encode($this->var['req_scheme'].'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']));# 搜尋dheader("Location:http://".$this->var['setting']['domain']['app']['default'].$_SERVER['REQUEST_URI']);# 修改成dheader("Location:'. $this->var['req_scheme'] .'://".$this->var['setting']['domain']['app']['default'].$_SERVER['REQUEST_URI']);# 搜尋$mobileurl = 'http://'.$this->var['setting']['domain']['app']['mobile'];# 修改成$mobileurl = $this->var['req_scheme'].'://'.$this->var['setting']['domain']['app']['mobile'];# 搜尋$mobileurl = 'http://'.$this->var['setting']['domain']['app']['forum'].'?mobile=yes';# 修改成$mobileurl = $this->var['req_scheme'].'://'.$this->var['setting']['domain']['app']['forum'].'?mobile=yes';# 搜尋$this->var['setting']['mobile']['nomobileurl'] = ($this->var['setting']['domain']['app']['forum'] ? 'http://'.$this->var['setting']['domain']['app']['forum'].'/' : $this->var['siteurl']).$this->var['basefilename'].($query_sting_tmp ? '?'.$query_sting_tmp.'&' : '?').'mobile=no';# 修改成$this->var['setting']['mobile']['nomobileurl'] = ($this->var['setting']['domain']['app']['forum'] ? $this->var['req_scheme'].'://'.$this->var['setting']['domain']['app']['forum'].'/' : $this->var['siteurl']).$this->var['basefilename'].($query_sting_tmp ? '?'.$query_sting_tmp.'&' : '?').'mobile=no'; - 檔案:source/function/function_core.php
搜尋:$ucenterurl = empty($ucenterurl) ? $_G['setting']['ucenterurl'] : $ucenterurl;
修改成下面這樣
1234567891011static $staticavatar;if($staticavatar === null) {$staticavatar = $_G['setting']['avatarmethod'];}$ucenterurl = empty($ucenterurl) ? $_G['setting']['ucenterurl'] : $ucenterurl;if( $_G['req_scheme'] == 'https' ) {$ucenterurl = preg_replace("/http\:/s", "https:", $ucenterurl);}$size = in_array($size, array('big', 'middle', 'small')) ? $size : 'middle';$uid = abs(intval($uid)); - 檔案: uc_server/admin.php
在檔案開頭附近可以看到define('IN_UC', TRUE);
修改如下
1234567891011$mtime = explode(' ', microtime());$starttime = $mtime[1] + $mtime[0];$req_scheme = array_key_exists('REQUEST_SCHEME', $_SERVER) ? $_SERVER['REQUEST_SCHEME']: ( $_SERVER['SERVER_PORT'] == 443 || (array_key_exists('HTTPS', $_SERVER) && strtolower($_SERVER['HTTPS']) != 'off') ? 'https' : 'http');define('IN_UC', TRUE);define('UC_ROOT', substr(__FILE__, 0, -9));define('UC_API', strtolower($req_scheme.'://'.$_SERVER['HTTP_HOST'].substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/'))));define('UC_DATADIR', UC_ROOT.'data/');define('UC_DATAURL', UC_API.'/data'); - 檔案: uc_server/avatar.php
在檔案開頭可以看到 error_reporting(0); 修改如下
1234567error_reporting(0);$req_scheme = array_key_exists('REQUEST_SCHEME', $_SERVER) ? $_SERVER['REQUEST_SCHEME']: ( $_SERVER['SERVER_PORT'] == 443 || (array_key_exists('HTTPS', $_SERVER) && strtolower($_SERVER['HTTPS']) != 'off') ? 'https' : 'http');define('UC_API', strtolower($req_scheme.'://'.$_SERVER['HTTP_HOST'].substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/'))));$uid = isset($_GET['uid']) ? $_GET['uid'] : 0;$size = isset($_GET['size']) ? $_GET['size'] : '';
以上4個檔案改完後
開啟瀏覽器以 https 連線到論壇,應該都能正常顯示
會說應該是因為鸚鵡設定論壇時,關閉了全局設定中大部份的緩存功能
如果不能正常顯示,清除緩存後應該就可以解決
管理中心也可以正常進入,唯獨 UCenter 會有小狀況
以 http 協定在 管理中心 進入 UCenter 時沒有問題
但 https 協定在 管理中心 進入 UCenter 時會沒有畫面
這時候進入「站長」=>「UCenter 設置」畫面
將 「UCenter 訪問地址」由 http 改為 https 後
以 http 協定在 管理中心 進入 UCenter 時,左邊的選單沒辦法顯示
但 https 協定在 管理中心 進入 UCenter 時沒有問題,正常顯示
最後 鸚鵡 選擇的作法是:
「UCenter 訪問地址」 固定使用 https 協定,進入 管理中心 時也統一使用 https 協定
所以要改修改一個檔案
檔案:論壇目錄內的 admin.php
在檔案開頭的地方修改成如下
1 2 3 4 5 6 7 8 9 10 |
$req_scheme = array_key_exists('REQUEST_SCHEME', $_SERVER) ? $_SERVER['REQUEST_SCHEME'] : ( $_SERVER['SERVER_PORT'] == 443 || (array_key_exists('HTTPS', $_SERVER) && strtolower($_SERVER['HTTPS']) != 'off') ? 'https' : 'http'); if( $req_scheme != 'https' ) { header('Location: https://'.$_SERVER['HTTP_HOST'].$_SERVER["REQUEST_URI"]); exit(); } define('IN_ADMINCP', TRUE); define('NOROBOT', TRUE); define('ADMINSCRIPT', basename(__FILE__)); |
這樣在 http 協定點進 管理中心 時,會自動導向 https 協定
最後只要確認把論壇中有導入站外資源的部份都修改成使用 https 協定即可
以上就是鸚鵡修改的方式
在完全使用論壇資源時瀏覽器不會提示連線不安全