1. 程式人生 > >nginx location的優先順序

nginx location的優先順序

原來一直以為location的優先順序是先後順序,結果有次專案中傻眼了,趕緊百度一下,下面的內容參考了這個連結

location表示式型別

~ 表示執行一個正則匹配,區分大小寫
~* 表示執行一個正則匹配,不區分大小寫
^~ 表示普通字元匹配。使用字首匹配。如果匹配成功,則不再匹配其他location。
= 進行普通字元精確匹配。也就是完全匹配。
@ "@" 定義一個命名的 location,使用在內部定向時,例如 error_page, try_files

location優先順序說明

在nginx的location和配置中location的順序沒有太大關係。正location表示式的型別有關。相同型別的表示式,字串長的會優先匹配。
以下是按優先順序排列說明:
第一優先順序:等號型別(=)的優先順序最高。一旦匹配成功,則不再查詢其他匹配項。
第二優先順序:^~型別表示式。一旦匹配成功,則不再查詢其他匹配項。
第三優先順序:正則表示式型別(~ ~*)的優先順序次之。如果有多個location的正則能匹配的話,則使用正則表示式最長的那個。
第四優先順序:常規字串匹配型別。按字首匹配。

下面是我的一段示例程式碼,配置如下

user  root;
http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       38080;
        location ^~ /hls {
                        content_by_lua 'ngx.say("success /hls")
                        ngx.exit(ngx.OK)'
; } location / { content_by_lua 'ngx.say("success") ngx.exit(ngx.OK)'; } location ~* \.(m3u8|ts)$ { content_by_lua 'ngx.say("success *.m3u8") ngx.exit(ngx.OK)'; } } }

那麼如下請求如下連結,會輸出什麼呢

curl http://127.0.0.1:38080/demo/test.jpg
curl http://127.0.0.1:38080/demo/test.m3u8
curl http://127.0.0.1:38080/hls/test.m3u8
curl http://127.0.0.1:38080/hls/test.jpg

 

 

 

 

 

下面是輸出結果哈

success
success *.m3u8
success /hls
success /hls