一、路由Location的使用
1、Location语法规则
语法规则: location [=|~|~*|^~] /uri/ {… }
首先匹配 =,其次匹配^~,其次是按文件中顺序的正则匹配,最后是交给 /通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
符号 |
含义 |
= |
= 开头表示精确匹配 |
^~ |
^~开头表示uri以某个常规字符串开头,理解为匹配 url路径即可(禁止正则匹配)。 |
~ |
~ 开头表示区分大小写的正则匹配 |
~* |
~* 开头表示不区分大小写的正则匹配 |
!~和!~* |
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配的正则 |
/ |
用户所使用的代理(一般为浏览器) |
匹配规则优先级如下:
- =精准匹配命中时,停止location动作,直接走精准匹配,
- 一般匹配(含非正则)命中时,先收集所有的普通匹配,最后对比出最长的那一条
- 如果最长的那一条普通匹配声明为非正则,直接此条匹配,停止location
- 如果最长的那一条普通匹配不是非正则,继续往下走正则location
- 按代码顺序执行正则匹配,当第一条正则location命中时,停止location
默认端口及域名配置如下:
listen 80;
server_name loc.chj.com;
1.1、精准匹配:
# 精准匹配测试: http://loc.chj.com/equal/a/b/c
# 第1,2条虽然匹配,但第三条是精准匹配,出第三条结果
# 测试路径/equal/a/b/c
location ~ /equal/* { # 被命中,但被下面的推断:location = /equal/a/b/c
echo '/equal/*';
}
location /equal/a/b { # 被命中,但被下面的推断:location = /equal/a/b/c
echo '/equal/a/b';
}
location = /equal/a/b/c { # 被命中,直接执行,不等待
echo '/equal/a/b/c';
}
1.2、普通匹配测试:
# 普通匹配测试:http://loc.chj.com/match/a/b/c
# 第1,2条虽然匹配,第三条匹配更长,出第三条结果
# 测试路径/match/a/b/c
location /match/a { # 被命中,但不是最长
return 200 "/match/a";
}
location /match/a/b { # 被命中,但不是最长
return 200 "/match/a/b";
}
location /match/a/b/c { # 被命中,且最长
return 200 "/match/a/b/c";
}
location /match/a/b/c/d { # 不命中
return 200 "/match/a/b/c/d";
}
1.3、正则匹配覆盖普通匹配测试
#会覆盖普通匹配,不会覆盖=和^~
location =/re/a.js {#访问/re/a.js,不会被后面的正则覆盖
echo 'match =';
}
location ^~ /re/a/b {#访问/re/a/b开头的路径,不会被后面的正则覆盖
echo 'math ^~/re/a/b*';
}
location /re/a.htm {#访问/re/a.htm,会被后面的正则覆盖
echo 'match /re/a.htm';
}
location ~ /re/(.*)\.(htm|js|css)$ {#覆盖/re/