

基于全球的網(wǎng)絡安全,現(xiàn)在瀏覽器基本都將默認的HTTP站點標識為不安全,很多站點都將HTTP網(wǎng)站添加SSL證書,切換至HTTPS加密協(xié)議。
Nginx作為高性能的HTTP和反向代理web服務,一般作為服務入口提供負載均衡和流量分發(fā),因此我們在Nginx上添加SSL證書,實現(xiàn)HTTPS訪問;同時為保證用戶無感知,需要配置HTTP默認跳轉(zhuǎn)HTTPS。
下面我們來解析下泛域名下的http默認跳轉(zhuǎn)https。
server{
listen 80;
server_name *.test.cn;
rewrite ^(.*)$ https://$server_name$1 permanent;
}
此時瀏覽器訪問報錯:
其實此時使用rewrite跳轉(zhuǎn)在單域名是沒有問題,但是在多域名或泛域名下是有問題的,我們此時使用在nginx安裝echo-nginx-modulem模塊以調(diào)試(模塊安裝忽略)。
調(diào)試過程
1.依次打印nginx內(nèi)置變量server_name,host,http_host
server{
listen 80;
server_name *.test.cn;
location / {
default_type 'text/plain';
echo $server_name;
echo $host;
echo $http_host;
}
}
瀏覽器訪問:
2.錯誤分析
從變量打印來看:
server_name值為*.test.cn
host值為www.test.cn
http_host值為www.test.cn
此時雖然我們輸入域名為www.test.cn,但實際rewrite的url為:https://*.test.cn,因此訪問報錯。
注意:如果你的nginx的域名為"server_name a.test.cn *.test.cn
3.解決方式
根據(jù)變量值,我們需要更改rewrite后的url為:
rewrite ^(.*)$ https://$host$1 permanent;
或
rewrite ^(.*)$ https://$http_host$1 permanent;
return除了支持直接跟狀態(tài)碼,還可以跟字符串或者url鏈接,用于返回字符串或url鏈接。
http默認跳轉(zhuǎn)為https配置如下:
server{
listen 80;
server_name *.test.cn;
return 301 https://$http_host$request_uri;
}
return和rewrite雖然都實現(xiàn)了跳轉(zhuǎn),但是是有區(qū)別的:
1.return 指令簡單高效,建議盡量使用 return,而不是 rewrite;
2.return 指令告訴 Nginx 停止處理請求,直接返回 301 (Moved Permanently) 代碼并跳轉(zhuǎn)重寫后的地址;
3.rewrite指定并不會立即結(jié)束Nginx的處理流程,會根據(jù)重寫后的地址繼續(xù)匹配相應的location,除非使用break結(jié)束。
如果使用Nginx+Lua,你會發(fā)現(xiàn)在整個Nginx的訪問流程中,return指令處于rewrite階段,而rewrite指令處于access階段,因此return的優(yōu)先級是高于ngx_limit_req訪問頻率限制的。
【版權(quán)聲明】:本站內(nèi)容來自于與互聯(lián)網(wǎng)(注明原創(chuàng)稿件除外),供訪客免費學習需要。如文章或圖像侵犯到您的權(quán)益,請及時告知,我們第一時間刪除處理!謝謝!
售后服務:13534259410 (7×24小時)
在線 Q Q:253849310 (售前咨詢)
深圳無雙科技,專注于深圳網(wǎng)站建設(shè)、深圳網(wǎng)站設(shè)計、深圳網(wǎng)站制作。
服務客戶超3000家,一站式網(wǎng)站建設(shè)及推廣營銷解決方案提供商。
我們的價值觀:誠信、坦誠、盡責、創(chuàng)新。期待與您合作!