天天看點

Nginx實作URL重寫1.準備工作。2.什麼是URL重寫?3.使用介紹4.Nginx配置5.測試6.總結

本文利用Nginx實作URL重寫,本文使用Nginx與靜态頁面配合重寫URL。

1.準備工作。

結合本文場景,需要安裝Nginx。

1.1 關于Linux系統安裝Nginx可以參考我的文章---(

傳送門

)。

2.什麼是URL重寫?

URL重寫是指将一個URL請求重新寫成網站可以處理的另一個URL的過程。這樣說可能不是很好了解,舉個例子來說明一下,在開發中可能經常遇到這樣的需求,比如通過浏覽器請求的

http://localhost:8080/getUser?id=1

,但是需要通過SEO優化等等原因,需要把請求的位址重寫為

http://localhost:8080/getUser/1

這樣的URL,進而符合需求或者更好的被網站閱讀。

當遇到這種請求的時候,就需要使用到UrlRewrite重寫或者使用一些網關路由,如SpringCloud的Gateway,Zuul,又或者是Nginx來實作這個功能。

本文介紹Nginx實作URL重寫。

3.使用介紹

在Nginx中使用URL重寫需要使用到一個指令-----rewrite,其文法如下:

rewrite regex replacement [flag];            
  • regex :可以使用正則或者字元串來表示相比對的位址。
  • replacement:可以表示重定向的位址。
  • flag :flag标志的作用是用于控制當比對到對應的rewrite規則後是否繼續檢查後續的rewrite規則。

flag值為如下四種,分别是:

  • last:停止處理目前的rewrite指令集,而後通過重寫後的規則重新發起請求,浏覽器位址欄URL位址不變。
  • break:和break指令一樣,都是停止處理目前上下文中的其他重寫子產品指令。
  • redirect:如果替換字元串不以“ http:// ”,“ https:// ”或“ $scheme” 開頭,傳回帶有302代碼的臨時重定向,浏覽器位址會顯示跳轉後的URL位址。
  • permanent:傳回301代碼的永久重定向,浏覽器位址欄會顯示跳轉後的URL位址。

例如:

server {
    ...
    rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
    rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra  last;
    return  403;
    ...
}           

另外還可以根據if來判斷,指令如下:

if (condition) { ... }           

其中condition是條件,如果為true,則執行大括号中的内容:

  • 使用“ =”和“ !=”運算符比較變量和字元串;
  • 使用“ ~”(對于區分大小寫的比對)和“ ~”(對于不區分大小寫的比對)運算符,将變量與正規表達式進行比對。正規表達式可以包含可供以後在$1.. $9變量中重用的捕獲。負操作符“ !~”和“ !~”也可用。如果正規表達式包含“ }”或“ ;”字元,則整個表達式應包含在單引号或雙引号中。
  • 使用“ -f”和“ !-f”運算符檢查檔案是否存在;
  • 使用“ -d”和“ !-d”運算符檢查目錄是否存在;
  • 使用“ -e”和“ !-e”運算符檢查檔案,目錄或符号連結是否存在;
  • 使用“ -x”和“ !-x”運算符檢查可執行檔案。
if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
}

if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
    set $id $1;
}

if ($request_method = POST) {
    return 405;
}

if ($slow) {
    limit_rate 10k;
}

if ($invalid_referer) {
    return 403;
}           

4.Nginx配置

本文例子隻是将請求跳轉到本人的部落格首頁

http://www.dalaoyang.cn/

,配置如下:

worker_processes  1;

events {
    worker_connections  1024;
}

http {

   server {
       listen       10000;
       server_name  localhost;

       #如果host不是dalaoyang.cn,則301到www.dalaoyang.cn中
       if ( $host != "dalaoyang.cn" ){
         rewrite ^/(.*)$ https://www.dalaoyang.cn/$1 last;
       }

    }

}           

5.測試

測試就比較簡單了,在浏覽器通路

http://localhost:10000/about

,會自動跳轉到

https://www.dalaoyang.cn/about

,如圖所示。

6.總結

大部分内容都是參考自Nginx官網來學習的,官網的例子都很詳細。

參考自Nginx官網ngx_http_rewrite_module子產品官方API---

繼續閱讀