文章原創於公衆號:程序猿周先森。本平臺不定時更新,喜歡個人文章,歡迎關注個人微信公衆號。
html
上一篇文章對Nginx的Location配置進行了講解,本篇主要對於Nginx中的Rewrite跳轉進行講解。由於目前不少工做前端開發都會選擇使用Nginx做爲反向代理服務器,可是平時業務須要不免碰到重寫URL,Nginx的Rewrite跳轉有什麼使用場景呢?前端
不得不說的是Apache服務器規則庫很強大,作跳轉也很簡單,可是Nginx使用Rewrite實現跳轉效率更高,因此這也是咱們須要學習Nginx的Rewrite模塊的目的所在。Rewrite是Nginx的靜態重寫模塊,跳轉的使用場景有如下幾種情形:正則表達式
Rewrite如何實現跳轉?api
Nginx利用ngx_http_rewrite_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將用戶請求的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能夠經過ungx_http_referrer_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
}
}
若是喜歡個人文章,歡迎關注個人我的公衆號