Nginx Rewrite

无敌小鲁班發表於2024-06-10

目錄
  • 1.常用的Nginx 正規表示式
  • 2.location
  • 3.rewrite

1.常用的Nginx 正規表示式

^ :匹配輸入字串的起始位置
$ :匹配輸入字串的結束位置
* :匹配前面的字元零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+ :匹配前面的字元一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
? :匹配前面的字元零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效於”{0,1}”
. :匹配除“\n”之外的任何單個字元,若要匹配包括“\n”在內的任意字元,請使用諸如“[.\n]”之類的模式
\ :將後面接著的字元標記為一個特殊字元或一個原義字元或一個向後引用。如“\n”匹配一個換行符,而“\$”則匹配“$”
\d :匹配純數字[0-9]   \s :空白符    \w :任意單詞字元包括下劃線[A-Za-z0-9_]
{n} :重複 n 次
{n,} :重複 n 次或更多次
{n,m} :重複 n 到 m 次
[] :定義匹配的字元範圍
[c] :匹配單個字元 c
[a-z] :匹配 a-z 小寫字母的任意一個
[a-zA-Z0-9] :匹配所有大小寫字母或數字
() :表示式的開始和結束位置
| :或運算子

從功能看 rewrite 和 location 似乎有點像,都能實現跳轉,主要區別在於 rewrite 是在同一域名內更改獲取資源的路徑,而 location 是對一類路徑做控制訪問或反向代理,還可以proxy_pass 到其他機器。
rewrite 對訪問的域名或者域名內的URL路徑地址重寫
location 對訪問的路徑做訪問控制或者代理轉發

2.location

location 透過字首或正則匹配使用者的URL訪問路徑做頁面跳轉、訪問控制和代理轉發

location  URL路徑       #一般字首匹配
location = URL路徑      #精準匹配
location ^~ URL路徑     #字首匹配
location ~ URL路徑      #正則匹配,區分大小寫
location ~* URL路徑     #正則匹配,不分割槽大小寫
location !~ URL路徑     #正則匹配取反
location !~* URL路徑    #正則匹配取反,不分割槽大小寫


location匹配機制:
優先順序:精準匹配 =  >  最長字首匹配 ^~  >  正則匹配 ~ ~* !~ !~*  >  一般字首匹配 /XXXX  >  通用匹配 /

注:在沒有合適的精準匹配的情況下,先看字首匹配的長度,取最長匹配的location(如果此最長匹配是帶有^~的則不再看正則匹配;如果此最長匹配是不帶有^~的則會繼續再看正則匹配)
字首匹配看長度,最長的優先匹配;正則匹配看上下順序,根據nginx配置檔案的配置由上往下依次匹配,匹配到即停止

#網站首頁匹配
location = / {
    root 網頁根目錄;
	index index.html;
}

#網站靜態頁面,透過字首匹配或通用匹配在nginx伺服器本地處理
location ~ /static/ {
    root 目錄;
}

location / {
    root 目錄;
}

#網站動態頁面,透過匹配不同的動態網頁檔案字尾轉發給不同的後端應用伺服器處理
location \.php$ {
    fastcgi_pass PHP伺服器地址:埠;
}

location \.jsp$ {
    proxy_pass TOMCAT伺服器地址:埠;
}

3.rewrite

rewrite 對使用者的URL訪問路徑進行重寫,再重定向跳轉訪問重寫後的路徑

rewrite格式
rewrite  正規表示式  重寫的地址  [標記位];
                      
標記位
last 本條規則匹配完成後,不終止重寫後的url匹配,一般用在 server 和 if 中
break 本條規則匹配完成即終止,終止重寫後的url匹配,一般使用在 location 中
permanent 返回302臨時重定向,瀏覽器地址會顯示跳轉後的URL地址
redirect 返回301永久重定向,瀏覽器位址列會顯示跳轉後的URL地址

rewrite預設情況下只對從域名後面的根目錄 / 開始到傳遞引數的 ? 號前面的URL路徑進行重寫

##預設只對域名後面的URL部分重寫
rewrite 正規表示式 /新URL;                   
http://域名/舊URL  ->  http://域名/新URL    

##如果需要全域名路徑重寫需要加上協議和域名        
rewrite 正規表示式 http://新域名/新URL;       
http://舊域名/舊URL  ->  http://新域名/新URL;      
  
http://域名/舊URL  --rewrite重寫-->  http://域名/新URL -->  location匹配新URL路徑跳轉頁面


rewrite 正規表示式 /新URL  permanent;     #重寫後會修改瀏覽器裡的位址列再重新訪問
http://域名/舊URL  --rewrite重寫-->  http://域名/新URL --> 瀏覽器位址列也會改為 http://域名/新URL 再發起一次訪問請求 -->  location匹配新URL路徑跳轉頁面





location ~ URL路徑正規表示式 {
    rewrite  正規表示式  重寫的地址  [標記位];
}
    $request_uri
    if ($uri ~ URL路徑正規表示式) {
    rewrite  正規表示式  重寫的地址  [標記位];
}






$request_uri:包含請求引數的原始URI,不包含主機名
$uri:這個變數指當前的請求URI,不包括任何引數
$document_uri:與$uri相同,這個變數指當前的請求URI,不包括任何傳遞引數

相關文章