nginx location正則寫法

2021-08-24 17:23:11 字數 3997 閱讀 8430

乙個示例:

location ~* /js/.*/\.js順序 no優先順序:

(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ~,~* 正則順序) > (location 部分起始路徑) > (/)

上面的匹配結果

按照上面的location寫法,以下的匹配示例成立:

所以實際使用中,個人覺得至少有三個匹配規則定義,如下:

#直接匹配**根,通過網域名稱訪問**首頁比較頻繁,使用這個會加速處理,官網如是說。

#這裡是直接**給後端應用伺服器了,也可以是乙個靜態首頁

# 第乙個必選規則

location = /

# 第二個必選規則是處理靜態檔案請求,這是nginx作為http伺服器的強項

# 有兩種配置模式,目錄匹配或字尾匹配,任選其一或搭配使用

#第三個規則就是通用規則,用來**動態請求到後端應用伺服器

#非靜態檔案請求就預設是動態請求,自己根據實際把握

#畢竟目前的一些框架的流行,帶.php,.jsp字尾的情況很少了

location /

rewrite功能就是,使用nginx提供的全域性變數或自己設定的變數,結合正規表示式和標誌位實現url重寫以及重定向。rewrite只能放在server{},location{},if{}中,並且只能對網域名稱後邊的除去傳遞的引數外的字串起作用,例如只對/a/we/index.php重寫。語法rewrite regex replacement [flag];

如果相對網域名稱或引數字串起作用,可以使用全域性變數匹配,也可以使用proxy_pass反向**。

表明看rewrite和location功能有點像,都能實現跳轉,主要區別在於rewrite是在同一網域名稱內更改獲取資源的路徑,而location是對一類路徑做控制訪問或反向**,可以proxy_pass到其他機器。很多情況下rewrite也會寫在location裡,它們的執行順序是:

執行server塊的rewrite指令

執行location匹配

執行選定的location中的rewrite指令

如果其中某步uri被重寫,則重新迴圈執行1-3,直到找到真實存在的檔案;迴圈超過10次,則返回500 internal server error錯誤。

因為301和302不能簡單的只返回狀態碼,還必須有重定向的url,這就是return指令無法返回301,302的原因了。這裡 last 和 break 區別有點難以理解:

last一般寫在server和if中,而break一般使用在location中

last不終止重寫後的url匹配,即新的url會再從server走一遍匹配流程,而break終止重寫後的匹配

break和last都能組織繼續執行後面的rewrite指令

if判斷指令

語法為if(condition),對給定的條件condition進行判斷。如果為真,大括號內的rewrite指令將被執行,if條件(conditon)可以是如下任何內容:

-f!-f用來判斷是否存在檔案

-d!-d用來判斷是否存在目錄

-e!-e用來判斷是否存在檔案或目錄

-x!-x用來判斷檔案是否可執行

例如:

if ($http_user_agent ~ msie)  //如果ua包含"msie",rewrite請求到/msid/目錄下

if ($http_cookie ~* "id=([^;]+)(?:;|$)") //如果cookie匹配正則,設定變數$id等於正則引用部分

if ($request_method = post) //如果提交方法為post,則返回狀態405(method not allowed)。return不能返回301,302

if ($slow) //限速,$slow可以通過 set 指令設定

if (!-f $request_filename) //如果請求的檔名不存在,則反向**到localhost 。這裡的break也是停止rewrite檢查

if ($args ~ post=140) //如果query string中包含"post=140",永久重定向到example.com

location ~* \.(gif|jpg|png|swf|flv)$ //防盜煉

}

全域性變數

下面是可以用作if判斷的全域性變數

例:http://localhost:88/test1/test2/test.php

小括號()之間匹配的內容,可以在後面通過$1來引用,$2表示的是前面第二個()裡的內容。正則裡面容易讓人困惑的是\轉義特殊字元。

例1:

http 

# 注意不能在上面這條規則後面加上「last」引數,否則下面的set指令不會執行

set $image_file $3;

set $image_type $4;

}location /data

location = /image404.html

}

對形如/images/ef/uh7b3/test.png的請求,重寫到/data?file=test.png,於是匹配到location /data,先看/data/images/test.png檔案存不存在,如果存在則正常響應,如果不存在則重寫tryfiles到新的image404 location,直接返回404狀態碼。

例2:

rewrite ^/images/(.*)_(\d+)x(\d+)\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? last;
對形如/images/bla_500x400.jpg的檔案請求,重寫到/resizer/bla.jpg?width=500&height=400位址,並會繼續嘗試匹配location。

這個location

location ~ ^/(.+)\.3gp\.zip$

匹配 \.代表.    其中\是轉義字元。    單獨的.代表 匹配除換行符以外的任意字元   +匹配重複1次或更多次

nginx location 正則匹配

nginx 統計語句 1.根據訪問ip統計uv awk access.log sort uniq c wc l 2.統計訪問url統計pv awk access.log wc l 3.查詢訪問最頻繁的url awk access.log sort uniq c sort n k 1 r more 4...

nginx location正則寫法

乙個示例 順序 no優先順序 location location 完整路徑 location 路徑 location 正則順序 location 部分起始路徑 上面的匹配結果 按照上面的location寫法,以下的匹配示例成立 所以實際使用中,個人覺得至少有三個匹配規則定義,如下 直接匹配 根,通過...

nginx location正則匹配規則

示例 location location js js順序 優先順序 location location 完整路徑 location 路徑 location 正則順序 location 部分起始路徑 上面的匹配結果 按照上面的location寫法,以下的匹配示例成立 實際使用建議 所以實際使用中,個人...