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