解決nginx反向代理apache服務下的wordpress啓用證書後發生301循環重定向

nginx下反向代碼 apache 下的 wordpress啓用證書後的數據流大致以下:
image.pngphp

因爲wordpress在接收到請求後會進行:當前請求信息是否與數據庫中設置的當前網站地址相一致。從而致使在進行數據轉發時因爲在nginx層面發生了https與http的轉換,進而致使了301的問題。對應上面的數據流,對應的流程以下:css

image.png

若是把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

nginx+apache全面啓用https

在apache中啓用https,nginx在進行轉發時將數據按apache的證書進行加密後,傳給apache服務:
image.pngsegmentfault

以上便保證了訪問wordpress時協議也是https的。瀏覽器

這個方案最大的問題在於須要分別對nginx、apache配置證書。nginx在進行數據轉發時,進行了數據的解密與加密,apache又從新對數據進行了一次解密。從效率上來說確定是最低的,固然也是最不值得推薦的方案。wordpress

修改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源碼進行修改,雖然解決了問題,但仍有待完善。加密

相關文章
相關標籤/搜索