背景: 最近在搭建Discuz X
唯鸭,因為考慮支持HTTPS
派草,所以按照經(jīng)驗來部署證書搀缠,服務(wù)器用的是阿里云的云服務(wù),選擇了LNMP
近迁。但是chrome
一直都提示不安全艺普,還提示此網(wǎng)頁正試圖從未經(jīng)驗證的來源加載腳本 。這說明我頁面上加載的資源不純粹是https
的鉴竭,有部分是http
的或者有些資源不支持https
卻用了https
歧譬。打開瀏覽器控制臺找到提示的源,發(fā)現(xiàn)基本都是功能組件加載的時候是以http
加載的搏存。
在搜索學(xué)習(xí)之后瑰步,才定位到問題所在,例如在source/class/discuz/discuz_application.php
文件中
$_G['isHTTPS'] = ($_SERVER['HTTPS'] && strtolower($_SERVER['HTTPS']) != 'off') ? true : false;
使用$_SERVER['HTTPS']
來判斷是http
還是https
,但在Nginx+PHP-FPM
架構(gòu)下璧眠,nginx
使用fastcgi_pass
指令將請求傳遞給PHP-FPM
缩焦,但是在使用fastcgi_pass
時,Nginx
默認(rèn)不會將HTTPS
傳遞給PHP-FPM
责静。如果你使用的是Apache
袁滥,它就會自動設(shè)置HTTPS
服務(wù)器變量,PHP代碼可以通過$ _SERVER ['HTTPS']
檢查以確定請求是HTTPS
還是HTTP
灾螃。那現(xiàn)在就需要需改nginx
配置或者discuz
程序來解決問題题翻。基于服務(wù)器的兼容性考慮腰鬼,還是修改nginx
配置嵌赠。因為很多CMS程序(WordPress塑荒,Drupal,...)都是使用$ _SERVER ['HTTPS']
來確定請求是HTTPS
還是HTTP
姜挺。修改方法如下:
方法1:增加 一個fastcgi_param 環(huán)境變量即可齿税。
fastcgi_param HTTPS 'on';
將上述代碼添加至網(wǎng)站對應(yīng)的Nginx
配置文件中。但要注意初家,按我理解偎窘,這樣也會導(dǎo)致一個問題。因為這種方式屬于寫死環(huán)境變量溜在,在此環(huán)境變量生效的區(qū)域陌知,服務(wù)器無法判斷是http
請求還是https
請求。如果你的站點兩種請求都支持掖肋,建議把兩種請求的配置分開寫仆葡,類似與人工預(yù)設(shè)請求的類型。我的網(wǎng)站決定已經(jīng)只支持https
志笼,所以這種方式問題不大沿盅,http
的請求也設(shè)置了跳轉(zhuǎn)至https
。所以我只需要是寫在虛擬機配置文件中即可纫溃。
方法2:修改web程序的判斷方式腰涧,不要只根據(jù)環(huán)境變量來判斷,增加一個請求的端口的判斷條件紊浩。我們一般HTTP請求都使用80端口窖铡,而HTTPS則使用443端口。按照這個思路坊谁,可以將上訴文件中的代碼改為如下所示费彼。
$_G['isHTTPS'] = ($_SERVER['SERVER_PORT'] == 443 || $_SERVER['HTTPS'] && strtolower($_SERVER['HTTPS']) != 'off') ? true : false;
方法3:你要把代理程序改成Apache我也是沒辦法啊。
后記:記得檢查其他引用資料是否為https
比如模板中備案號查詢地址等處口芍。有問題歡迎留言討論箍铲!