2021年12月9日 星期四

Nginx學習筆記 (3) - Location 路由匹配

config 檔裡的 location 可用來定義請求 path 對應的回應

以下說明匹配規則

首先,要記住這幾個符號代表的意思:

1. = /uri:精準匹配,如果有對到搜尋會到此為止

2. ^~ /uri:前綴匹配,如果有對到搜尋會到此為止

3. ~ pattern:正規表達式匹配,區分大小寫

4. ~* pattern:正規表達式匹配,不區分大小寫

5. /uri:前綴匹配

6. /:通用匹配,所有的路徑一定會匹配到這個


採用的順序是:

1. = 精準匹配最優先

2. ^~ 前綴匹配,對到即使用

3. ~pattern, ~* pattern 正則匹配

4. 沒帶修飾的前綴匹配

5. 通用匹配

多個正則匹配的狀況,會選擇設定寫在上面的那個匹配

多個前綴匹配成功的狀況,會選擇匹配最長的那個


範例例題

server {
    listen       80;
    server_name  localhost;

    location = / {
        ...(1)
    }

    location / {
        ...(2)
    }

    location ~ \.(gif|jpg|png|js|css)$ {
        ...(3)
    }

    location ^~ /images/ {
        ...(4))
    }

    location /images/myspace/ {
        ...(5)
    }

    location ~* \.png$ {
        ...(6)
    }

    location /doc {
        ...(7)
    }

    location /docu {
        ...(8)
    }
}


假設打來的 Request 路徑是

- /test   -> (2)

首先會匹配到 / ,是(2)不是(1),因為 = 要完全匹配,只有 / 才會到(1),但還會繼續往下搜尋,下面的都沒有匹配,因此最終會走(2)


- /images/myspace   -> (3)

首先會匹配到 / ,但還會繼續往下搜尋,接著又匹配到 /images,因為是 ^~,這時就直接走 (3),不會再往下查到 (4)

在上面的設定,其實(5)是永遠走不到,因為開頭是 /images/ 一定就先在 (4) 那就匹配,且因為是 ^~ 會直接採用,所以 (5) 走不到


- /document  -> (8)

首先會匹配到 / ,但還會繼續往下搜尋,接著又匹配到 /doc,還會繼續往下搜尋,又匹配到 /docu,都是前綴匹配,會選擇匹配最長的那個,因此是 (8)


- /photo.png   ->  (3)

首先會匹配到 / ,但還會繼續往下搜尋,接著又匹配到 (3),還會繼續往下搜尋,又匹配到 (6),都是正則表達式匹配,會選擇在設定檔最上面的(3)



沒有留言:

張貼留言