1. 程式人生 > 實用技巧 >12,nginx location 的匹配順序

12,nginx location 的匹配順序

一:

1. 字首含義

   =  :精確匹配(必須全部相等)
    ~  :大小寫敏感
    ~* :忽略大小寫
    ^~ :只需匹配uri部分
    @  :內部服務跳轉

Location 配置demo:

1.=,精確匹配
        location = / {
            #規則
        }
        # 則匹配到 `http://www.example.com/` 這種請求。

2.~,大小寫敏感
        location ~ /Example/ {
                #規則
        }
        #請求示例
        #http://www.example.com/Example/  [成功]
        #http://www.example.com/example/  [失敗]

3.~*,大小寫忽略
    location ~* /Example/ {
                #規則
    }
    # 則會忽略 uri 部分的大小寫
    #http://www.example.com/Example/  [成功]
    #http://www.example.com/example/  [成功]

4.^~,只匹配以 uri 開頭
    location ^~ /img/ {
            #規則
    }
    #以 /img/ 開頭的請求,都會匹配上
    #http://www.example.com/img/a.jpg   [成功]
    #http://www.example.com/img/b.mp4 [成功]

5.@,nginx內部跳轉
    location /img/ {
        error_page 404 @img_err;
    }
    
    location @img_err {
        # 規則
    }
    #以 /img/ 開頭的請求,如果連結的狀態為 404。則會匹配到 @img_err 這條規則上。

 

二:

Nginx多個location匹配
首先匹配 =
其次匹配 ^~
其次是按檔案中順序的正則匹配
最後是交給 / 通用匹配
當有匹配成功時候,停止匹配,按當前匹配規則處理請求
例子,有如下匹配規則:

location = / {
#規則A
}
location = /login {
#規則B
}
location ^~ /static/ {
#規則C
}
location ~ .(gif|jpg|png|js|css)$ {
#規則D
}
location ~* .png$ {
#規則E
}
location / {
#規則F
}

那麼產生的效果如下:

訪問根目錄 /, 比如 http://localhost/ 將匹配規則 A
訪問 http://localhost/login 將匹配規則 B,http://localhost/register 則匹配規則 F
訪問 http://localhost/static/a.html 將匹配規則 C
訪問 http://localhost/a.gif, http://localhost/b.jpg 將匹配規則 D 和規則 E,但是規則 D 順序優先,規則 E 不起作用,而 http://localhost/static/c.png 則優先匹配到規則 C
訪問 http://localhost/a.PNG 則匹配規則 E,而不會匹配規則 D,因為規則 E 不區分大小寫。

訪問 http://localhost/category/id/1111 則最終匹配到規則 F,因為以上規則都不匹配。