1.location匹配变量与配置格式
location配置用于匹配请求的URL,即ngnix中的$request_uri变量
$request_uri
location配置格式:
location [ 空格 | = | ~ | ~* |^~|!~ | !~* ] /uri/ {}
2.loacation匹配顺序
location 匹配格式规则前缀有四种:
= 开头,表示精确匹配
^~ 开头,注意这不是一个正则表达式–它的目的是优于正则表达式的匹配;如果该location是最佳匹配,则不再进行正则表达式检测。
~ 开头,表示区分大小写的正则匹配;
~* 开头,表示不区分大小写的正则匹配
!~ && !~*:表示区分大小写不匹配的正则和不区分大小写的不匹配的正则
location 如果不带前缀就是普通字符串匹配:
/uri/ 普通字符串匹配
/ 绝对路径根目录匹配, 如果没有其它匹配,任何请求都会匹配到
匹配的搜索顺序优先级为:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)
首先匹配=
其次匹配^~
再其次按照配置文件的顺序进行正则匹配
最后是交给/进行通用匹配
注意:
当有匹配成功时,立刻停止匹配,按照当前匹配规则处理请求
特别注意:
优先搜索并不意味着优先命中!
字符串匹配优先搜索,但是只是记录下最长的匹配 ( 如果 ^~ 是最长的匹配,则会直接命中,停止搜索正则 ),然后继续搜索正则匹配,如果有正则匹配,则命中正则匹配,如果没有正则匹配,则命中最长的字符串匹配。
匹配模式及顺序举例:
location = /uri =开头表示精确匹配,只有完全匹配上才能生效。
location ^~ /uri ^~ 开头对URL路径进行前缀匹配,并且在正则之前。
location ~ pattern ~开头表示区分大小写的正则匹配。
location ~* pattern ~*开头表示不区分大小写的正则匹配。
location /uri 不带任何修饰符,也表示前缀匹配,但是在正则匹配之后,如果没有正则命中,命中最长的规则。
location / 通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default。
3、location与proxy_pass代理规则【麒麟测试总结】
3.1 location是否以“/”结尾
在ngnix中location进行的是模糊匹配
没有“/”结尾时,location/abc/def可以匹配/abc/defghi请求,也可以匹配/abc/def/ghi等
而有“/”结尾时,location/abc/def/不能匹配/abc/defghi请求,只能匹配/abc/def/anything这样的请求
3.2 proxy_pass是否以“/”结尾
在nginx中配置proxy_pass时,当在后面的url加上了/,相当于是绝对路径,则nginx不会把location中匹配的路径部分加入代理uri;如果没有/,则会把匹配的路径部分加入代理uri。
请求域名为:http://127.0.0.1
location /apiA/ {
# 结尾的/必须加上,否则跳转会失败
proxy_pass http://127.0.0.2/;
}
这里的反向跳转等价于 http://127.0.0.1/apiA/作为一个整体 全部替换成http://127.0.0.2/
请求http://127.0.0.1/apiA/test.html 会被代理到http://127.0.0.2/test.html
location /apiB/ {
# 结尾的/必须加上,否则跳转会失败
proxy_pass http://127.0.0.2/apix/;
}
这里的反向跳转等价于 http://127.0.0.1/apiB/作为一个整体 全部替换成http://127.0.0.2/apix/
请求http://127.0.0.1/apiB/test.html 会被代理到http://127.0.0.2/apix/test.html
2.一些情况下,不能确定替换的URI
location里是正则表达式,这种情况下,proxy_pass里最好不要有URI
在proxy_pass前面用了rewrite,如下,这种情况下,proxy_pass是无效的:
location /name/ {
rewrite /name/([^/]+) /users?name=$1 break;
# 结尾的/必须加上,否则跳转会失败
proxy_pass http://127.0.0.1/;
}