著應用服務的增多,服務可能部署在不同的服務器上。這些服務有可能存在IP、端口Port、請求的ContextPath等一樣的情況,怎么合理的配置他們的跳轉呢?下面介紹三種常見的跳轉方式。
0x01:根據不同域名判斷跳轉不同服務
就是根據在nginx.conf配置的server_name與域名或者(或者IP)匹配跳轉不同的服務。
#當客戶端訪問www.domain.com,監聽端口號為80,直接跳轉到data/www目錄下文件
server {
listen 80;
server_name www.domain.com;
location / {
root data/www;
index index.html index.htm;
}
}
#當客戶端訪問bbs.domain.com,監聽端口號為80,直接跳轉到data/bbs目錄下文件
server {
listen 80;
server_name bbs.domain.com;
location / {
root data/bbs;
index index.html index.htm;
}
}
0x02:根據不同端口判斷跳轉不同服務
就是根據在nginx.conf配置的listen指令匹配跳轉不同的服務。
#當客戶端訪問www.domain.com,監聽端口號為8081,直接跳轉到data/www目錄下文件
server {
listen 8081;
server_name www.domain.com;
location / {
root data/www;
index index.html index.htm;
}
}
#當客戶端訪問www.domain.com,監聽端口號為8082,直接跳轉到data/bbs目錄下文件
server {
listen 8082;
server_name www.domain.com;
location / {
root data/bbs;
index index.html index.htm;
}
}
0x03:根據鏈接的ContextPath不同跳轉不同的服務器
主要根據每個應用服務器的ContextPath的普通,匹配跳轉到不同的服務器。
章原創于公眾號:程序猿周先森。本平臺不定時更新,喜歡我的文章,歡迎關注我的微信公眾號。
上一篇文章對Nginx的Location配置進行了講解,本篇主要對于Nginx中的Rewrite跳轉進行講解。因為目前很多工作前端開發都會選擇使用Nginx作為反向代理服務器,但是平時業務需要難免碰到重寫URL,Nginx的Rewrite跳轉有什么使用場景呢?
不得不說的是Apache服務器規則庫很強大,做跳轉也很簡單,但是Nginx使用Rewrite實現跳轉效率更高,所以這也是我們需要學習Nginx的Rewrite模塊的目的所在。Rewrite是Nginx的靜態重寫模塊,跳轉的使用場景有以下幾種情形:
Rewrite如何實現跳轉?
Nginx利用ngxhttprewrite_module模塊解析和處理rewrite請求。Rewrite用于實現URL重寫,其實有點類似于重定向功能,可以將用戶的請求重寫至別的目錄,在一定程度上提高了網站安全性。Rewrite支持if條件判斷,但不支持else判斷。而且Rewrite需要PCRE支持,一次重定向最多可以跳轉10次,超過10次將返回500錯誤。Rewrite模塊包含set命令,可以創建變量用來記錄條件標識或者傳遞變量到其他的Location中。Rewrite實際上就是使用Nginx已有的全局變量或者通過set命令設置的變量結合正則表達式實現URL重寫。
Rewrite使用場景
在Nginx中使用Rewrite實現跳轉有以下三種場景:
所以說rewrite語句只允許放在server{ },if{ },location{ }中。接下來我們先看看if指令。
if指令
if指令用于條件匹配判斷,根據判斷結果選擇不同的Nginx配置,在server或location中配置。Nginx中的if指令只支持單重判斷,不支持多重判斷。我們簡單看個例子:
location /test{ index index.html; if ( $scheme = http ){ rewrite / https://www.niyueling.cn permanent; } if ($scheme = https ){ echo "if ---> $scheme"; } }
location上篇文章講過了,這里不再細講,接下來我們看下rewrite語法.
rewrite語法
rewrite regex replacement [flag]
rewrite將用戶請求的URL基于正則表達式regex進行檢查,匹配到時將其替換為正則表達式對應的新的URL。若在同一級配置模塊中存在多個rewrite規則,則會自頂向下檢查。replacement則為跳轉后的內容。[flag]作為標識符用于控制循環機制,如果替換后的URL是以http或者https開頭,則會直接301永久重定向。
flag參數介紹
rewrite語句有四種flag狀態:redirect、permanent、break、last。前兩種屬于客戶瀏覽器重新發起對新地址的請求,后兩種是在WEB服務器內部實現跳轉。
rewrite語法講完了我們可以一起來看看如何實現幾種方式跳轉:
(1) 在location中將舊域名永久重定向到新域名
location / {
root /data/html;index index.html;rewrite / http://www.niyueling.cn permanent;}
這里有必要提下臨時重定向與永久重定向的區別:
臨時重定向不會緩存新域名的解析記錄,但是永久重定向會緩存新域名的解析記錄。
(2) http自動跳轉https
有時候公司項目需要,會要求整個網站皆使用https,這時候為了用戶體驗,我們需要在用戶訪問http站點的時候自動跳轉到https站點中。
location / {
root /opt/blog;index index.html;
if ( $scheme = http ){rewrite / https://www.niyueling.cn permanent;}}
上面配置其實就是如果用戶請求協議為http的時候使用rewrite跳轉到對應的https站點。但是if語句不能去掉,否則就會陷入死循環。
(3) 如果用戶請求URL不存在跳轉首頁
location / { root /opt/blog; index index.html; if ( !-f $request_filename ){ rewrite (.*) http://www.niyueling.cn; } }
(4) 實現防盜鏈
防盜鏈實際上是基于前端攜帶的referer實現,referer可以記錄用戶從哪個界面跳轉而來的標志信息。Nginx可以通過ungxhttpreferrer_module模塊來檢查請求的referer信息是否有效實現防盜鏈功能
location ^~ /test { root /opt/blog; index index.html; valid_referers none blocked server_names *.niyueling.cn www.niyueling.* api.online.test/v1/hostlist ~\.google\. ~\.baidu\.; #定義有效的referer if ($invalid_referer) { #假如是使用其他的無效的referer訪問: return 403; #返回狀態碼403 } }
如果喜歡我的文章,歡迎關注我的個人公眾號
文章向大家介紹詳解NGINX訪問https跳轉到http的解決方法,主要包括詳解NGINX訪問https跳轉到http的解決方法使用實例、應用技巧、基本知識點總結和需要注意事項,具有一定的參考價值,需要的朋友可以參考一下。
關于使用HTTPS/SSL的必要性,可以自行baidu,援引的說法,EFF(Electronic Frontier Foundation),全球過半流量采用https。下面我們介紹使用rewrite 方式實現http 跳轉 https。
Nginx - rewrite 方式
Nginx Server 配置
*請認真填寫需求信息,我們會在24小時內與您取得聯系。