Nginx功能-路由功能

Nginx的路由功能實現由location來完成,根據location匹配的路徑執行內部指令。

location對url的匹配語法:

location [=|~|~*|^~] /uri/ { … }

1、=:表示精準匹配

2、普通匹配

      2.1 、~:區分大小寫

      2.2、~*:不區分大小寫

      2.3^~:非正則表達式匹配

3、\$:正則表達式

其中優先級爲精準匹配>普通匹配>正則表達式。但是最終使用哪個路徑不是簡簡單單的優先級就決定了。下面會根據實例慢慢分析。

1、標準匹配,如果都能匹配到,則nginx會選擇最長匹配返回。而且精準匹配不會被其他普通匹配或者正則表達式覆蓋。

location = /equal/a {
                echo '/equal/a';
        }

        location = /equal/a/b {
                echo '/equal/a/b';
        }

        location = /equal/a/b/c {
                echo '/equal/a/b/c';
        }

curl http://water.com/equal/a/b則會輸出 /equal/a/b

curl http://water.com/equal/a/b/c則會輸出 /equal/a/b/c

2、普通匹配,如果都能匹配到,則nginx會選擇最長匹配返回。與精準匹配類似,但是普通匹配有可能被正則表達式覆蓋。

 location /match/a{#命中,當不是最長
                echo '/match/a';
        }
        location /match/a/b {#命中,當不是最長
                echo '/match/a/b';
        }

        location /match/a/b/c {#命中,是最長
                echo '/match/a/b/c';
        }

        location /match/a/b/c/d {#命中,當不是最長
                echo '/match/a/b/c/d';
        }

普通匹配(非正則表達式)不會被正則表達式,因爲普通匹配的的非正則表達式已經聲明不使用正則表達式,所以不不會被正則覆蓋。
        location ^~ /re/a/b{#普通匹配-非正則匹配,訪問/re/a/b開頭的路徑,不會被後面的正則覆蓋
                echo 'match ^~ /re/a/b*';
        }


       location /re/a.html{#普通匹配,訪問/re/a.html,會被後面的正則覆蓋
                echo 'match /re/a.html';
        }


       location ~ /rex/a/(.*)\.(html|js|css)$ {#正則表達式,覆蓋/re/a.html路徑,但是不會覆蓋 ^~ /re/a/b
                echo 'match second';
        }

3、正則表達式,如果出現多個正則表達式匹配,則以出現的順序爲準

 #正則匹配,括號裏變量替換$1,$2
        location ~ /re/(.*)\.(html|js|css)$ {#覆蓋/re/a.html路徑
                echo 'cover /re/$1.$2';
        }

        #正則表達式匹配,以出現順序爲準
        location ~ /rex/(.*)\.(html|js|css)$ {#覆蓋/re/a.html路徑
                echo 'match first';
        }

        location ~ /rex/a/(.*)\.(html|js|css)$ {#覆蓋/re/a.html路徑
                echo 'match second';
        }

        location ~ /rex/a/b/(.*)\.(html|js|css)$ {#覆蓋/re/a.html路徑
                echo 'match third';

        }
由此我們發現,基本優先級是精準匹配>普通匹配>正則表達式,但是不是絕對的,因爲普通匹配又是有可能被正則表達式覆蓋的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章