nginx下反向代碼 apache 下的 wordpress啓用證書後的數據流大致以下:
php
因爲wordpress在接收到請求後會進行:當前請求信息是否與數據庫中設置的當前網站地址相一致。從而致使在進行數據轉發時因爲在nginx層面發生了https與http的轉換,進而致使了301的問題。對應上面的數據流,對應的流程以下:css
若是把wordpress中的網站地址變動爲:http://www.codedemo.club,則因爲在判斷協議的時候http與http相同,則不會發生301的錯誤。但因爲wordpress內部發送靜態資源地址時,地址上加入了網站前綴,好比發送的CSS地址爲:http://www.codedemo.club/sytle.css
,而非/sytle.css
。這將觸發一個瀏覽器的一個保護機制 ---- 瀏覽器阻止:在一個https的頁面上調用http請求。nginx
吐個槽:話說學校某教學相關的系統正是因爲在https頁面上加載了http插件,從而致使一些EXCEL的導出沒法正常工做了。
結合上文描述以及在因爲定製端口致使的301重定向問題
一文中的分析,得出如下結論:若要避免wordpress的301問題,則必須保證轉發給wordpress的域是相同的。數據庫
又因爲域相同的三要素是:協議、域名、端口號。因此最終的結論是:若要避免wordpress的301問題,則必須保證轉發給wordpress的協議、域名、端口號都是相同的。apache
在apache中啓用https,nginx在進行轉發時將數據按apache的證書進行加密後,傳給apache服務:
segmentfault
以上便保證了訪問wordpress時協議也是https的。瀏覽器
這個方案最大的問題在於須要分別對nginx、apache配置證書。nginx在進行數據轉發時,進行了數據的解密與加密,apache又從新對數據進行了一次解密。從效率上來說確定是最低的,固然也是最不值得推薦的方案。wordpress
另外一種方案是在nginx將當前協議經過header轉發。wordpress判斷轉發的header信息中協議是否爲https。若是爲https則重置系統變量,從而讓wordpress誤認爲當前的http請求爲https請求:
修正文件爲:wp-config.php網站
define( 'WP_DEBUG', false ); + if ( $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ) + { + $_SERVER['HTTPS'] = 'on'; + $_SERVER['SERVER_PORT'] = 443; + }
本方案須要對wordpress源碼進行修改,雖然解決了問題,但仍有待完善。加密