使用過nginx的同學都知道,在nginx配置文件中通過location配置路由轉發(fā)規(guī)則,配置語法為:
location [=|~|~*|^~] /uri/ {
...
}
中括號中為路由匹配符號,常見的有:
1 =:精確匹配
2 ^~:精確前綴匹配
3 ~:區(qū)分大小寫的正則匹配
4 ~*:不區(qū)分大小寫的正則匹配
5 /uri:普通前綴匹配
6 /:通用匹配
精確匹配
精確匹配使用 = 表示,nginx進行路由匹配的時候,精確匹配具有最高的優(yōu)先級,請求一旦精確匹配成功nginx會停止搜索其他到匹配項
配置實例
location = /test {
...
}
精確前綴匹配
精確前綴匹配的優(yōu)先級僅次于精確匹配,nginx對一個請求精確前綴匹配成功后,停止繼續(xù)搜索其他到匹配項
配置實例
location ^~ /test_a {
...
}
正則匹配
正則匹配分為區(qū)分大小寫和不區(qū)分大小寫兩種,分別用 ~ 和 ~* 表示;一個請求精確匹配和精確前綴匹配都失敗后,如果配置有相關的正則匹配location,nginx會嘗試對該請求進行正則匹配。需要說明的是正則匹配之間沒有優(yōu)先級一說,而是按照在配置文件中出現的順序進行匹配,一旦匹配上一個,就會停止向下繼續(xù)搜索
配置實例
# 配置1
location ~ /test_a {
...
}
# 配置2
location ~* /test_A {
...
}
對于請求 /test_a/hello 來說會被匹配到 配置1 處理,/test_A/hello 則會被匹配給 配置2 處理
普通前綴匹配
普通前綴匹配前面沒有任何修飾符,直接在location后寫需要匹配的uri,它的優(yōu)先級次于正則匹配
配置實例
location /img {
...
}
通用匹配
通用匹配使用一個 / 表示,可以匹配所有請求,一般nginx配置文件最后都會有一個通用匹配規(guī)則,當其他匹配規(guī)則均失效時,請求會被路由給通用匹配規(guī)則處理;如果沒有配置通用匹配,并且其他所有匹配規(guī)則均失效時,nginx會返回 404 錯誤
配置實例
location / {
...
}
引用一個完整例子
nginx路由規(guī)則配置:
location = / {
echo "規(guī)則A";
}
location = /login {
echo "規(guī)則B";
}
location ^~ /static/ {
echo "規(guī)則C";
}
location ^~ /static/files {
echo "規(guī)則X";
}
location ~ \.(gif|jpg|png|js|css)$ {
echo "規(guī)則D";
}
location ~* \.png$ {
echo "規(guī)則E";
}
location /img {
echo "規(guī)則Y";
}
location / {
echo "規(guī)則F";
}
| 請求uri | 匹配路由規(guī)則 |
|---|---|
| http://localhost/ | 規(guī)則A |
| http://localhost/login | 規(guī)則B |
| http://localhost/register | 規(guī)則F |
| http://localhost/static/a.html | 規(guī)則C |
| http://localhost/static/files/a.txt | 規(guī)則X |
| http://localhost/a.png | 規(guī)則D |
| http://localhost/a.PNG | 規(guī)則E |
| http://localhost/img/a.gif | 規(guī)則D |
| http://localhost/img/a.tiff | 規(guī)則Y |
以上是對nginx路由匹配規(guī)則的粗略總結和歸納,如有不足之處歡迎指正,共同探討!