Discuz!X3.2論壇實現全站HTTPS終極方法教程
2024-09-11 09:05:52
供稿:網友
Discuz! X3.2 本身對HTTPS的支持很有限,程序本身支持,但還有很多地方需要調整和修改的。 真正的全站HTTPS就是: 1)站點全部鏈接默認HTTPS,無任何HTTP鏈接通過301跳轉到HTTPS。 2)瀏覽器顯示綠色安全標志,無“不安全內容”提示。 具體來說,我們需要從以下6個方面來實現我們最終的效果。 一、服務器前端程序的配置 一般來說,大家多使用Nginx作為前端程序,關于Nginx開啟HTTPS的教程,網上有很多 這是本論壇的Nginx配置文件,Nginx版本為1.8.0。 server { listen 80; server_name www.aizhanku.com; index index.html index.htm index.php default.html default.htm default.php; root /data/web/www.aizhanku.com; return 301 http://$server_name$request_uri; #HSTS } server { listen 443 ssl; #listen [::]:80; server_name www.aizhanku.com; index index.html index.htm index.php default.html default.htm default.php; root /data/web/www.aizhanku.com; #SSL Start ssl_certificate /root/ssl.crt; ssl_certificate_key /root/ssl.key; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; #SSL End include discuzx.conf; #error_page 404 /404.html; location ~ [^/]/.php(/|$) { # comment try_files $uri =404; to enable pathinfo try_files $uri =404; fastcgi_pass unix:/tmp/php-cgi.sock; fastcgi_param HTTPS $https if_not_empty; fastcgi_index index.php; include fastcgi.conf; #include pathinfo.conf; } location ~ .*/.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*/.(js|css)?$ { expires 12h; } access_log off; } 二、Discuz判斷服務器是否使用SSL的修補和完善 Discuz判斷服務器是否使用SSL的代碼不適合Nginx+CGI的情況,即PHP-FPM。這個時候我們需要修改以下文件: Discuz采用 $_SERVER[‘HTTPS’] 的方式來判斷SSL,但是因為我的VPS架構問題(nginx+php-fpm),無法采用這種方式識別,所以需要對Discuz程序進行一些調整(使用 $_SERVER[‘SERVER_PORT’] 來判斷)。 source/class/discuz/discuz_application.php(約第187行處): 查找: $_G['isHTTPS'] = ($_SERVER['HTTPS'] && strtolower($_SERVER['HTTPS']) != 'off') ? true : false; 修改為: $_G['isHTTPS'] = ($_SERVER['SERVER_PORT'] == 443 || $_SERVER['HTTPS'] && strtolower($_SERVER['HTTPS']) != 'off') ? true : false; uc_server/avatar.php (約第13行處): 查找: 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 三、除去非HTTPS內容避免提示”不安全內容“ Source/plugin/manyou/Service/DiscuzTips.php ,最后的那段JS加載腳本刪除就行。 非樓主層如果有點評,那么點評者頭像不是HTTPS開頭,也需要修改一個文件來適配:template/default/forum/viewthread_node_body.htm(約180行),搜索div class="psta vm">,將下面一行注釋掉或者刪除。 打開瀏覽器,使用開發者工具或者查看源碼逐一排查加載的非HTTPS資源并修改。 四、后臺設置的修改完善 在后臺還有一些設置,可能會干擾https的使用 后臺 >全局 > 站點URL,改為https開頭的 后臺 > 站長 > UCenter設置 > UCenter 訪問地址,修改為https開頭的 UCenter后臺 > 應用管理 > 應用的主URL,修改為https開頭。修改后可能會顯示通訊失敗,如果UC和論壇程序安裝在同一機器,此失敗可無視,實測可以和UC正常通訊不影響(測試是否正常通訊程序的Bug),如果UC和論壇程序不在一臺機器上,有可能不能通訊。 另外在 后臺 > 全局 > 域名設置 中的一些設置也可能使https失效,如果更新緩存后論壇默認連接還是HTTP,請刪除 后臺 > 全局 > 域名設置 > 應用域名 > 默認 里面的默認域名(一般去forum.php尾巴這里會有內容,為了HTTPS請刪除)。 五、模板的調整 主要在模板的foot.html以及header.html等文件中,使用工具逐一排查模板文件中寫死的HTTP鏈接,修改為HTTPS。 六、數據庫的調整 在論壇這種交互社區中,經常回復發帖時會有出現主域名的鏈接,在沒有HTTPS之前,鏈接都是HTTP開頭,這個時候,我們需要修改數據庫,運行下面的mysql命令更新數據庫,將HTTP替換為HTTPS: 進入DZ后臺:站長 – 數據庫 – 升級 UPDATE pre_forum_post SET message=REPLACE(message,'http://www.CUOxin.com/','http://www.CUOxin.com/'); #請將www.CUOxin.com替換為自己的域名 需要注意的是,出于安全考慮,Discuz后臺默認情況下禁止 SQL 語句直接執行,只能使用常用 SQL 當中的內容,如果想自己隨意書寫SQL升級語句,需要將程序文件config/config_global.php當中的$_config[admincp][runquery] 設置修改為1。