Nginx的location规则:优先级和路径替换

Nginx是反向代理和负载均衡的首选工具,nginx的location配置有许多细节内容在网上不容易找到资料,或者解释不清。本文对locaiton的常见特性进行介绍。

 

location的优先级
locaiton有四种类型的匹配规则,分别为完全匹配(=)、前缀普通匹配(^~)、正则表达式匹配(~或者~*)、普通匹配

规则

等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项
前缀普通匹配(^~)优先级次之。不支持正则表达式。使用前缀匹配,如果有多个location匹配的话,则使用表达式最长的那个
正则表达式类型(~ ~*)的优先级次之。一旦匹配成功,则不再查找其他匹配项
常规字符串匹配,如果有多个location匹配的话,则使用表达式最长的那个
说明

先判断精准命中,如果命中,立即返回结果并结束解析过程
若未结束,判断前缀普通命中,如果有多个命中,使用表达式“最长”的命中结果,结束解析过程
若未结束,继续判断正则表达式的匹配,按正则表达式顺序为准,由上至下一旦匹配成功1个,立即返回结果,并结束解析过程
若未结束,继续普通命中,普通命中和前缀普通命中相似,顺序无所谓,按照location表达式的长短来确定命中结果
“最长”命中

^~和普通命中,都是优先使用匹配最长的结果,示例如下:

location ^~ /a {
    root /;
}
location ^~ /aaa {
    root /aaa;
}


如果url为/aaa,则上面两个location都匹配成功,但用于location ^~ /aaa较长,所以最终会以/aaa作为root

上例中如果是普通匹配(把location的^~去掉),结果也是一样的

 

路径替换
规则

配置proxy_pass时,可以实现URL路径的部分替换。

proxy_pass的目标地址,默认不带/,表示只代理域名,url和querystring部分不会变(把请求的path拼接到proxy_pass目标域名之后作为代理的URL)

如果在目标地址后增加/,则表示把path中location匹配成功的部分剪切掉之后再拼接到proxy_pass目标地址

比如请求 /a/b.html

location /a {
    proxy_pass http://server;
}
location /a {
    proxy_pass http://server/;
}


如上两个匹配成功后,实际代理的目标url分别是

http://server/a/b.html (把/a/b.html拼接到http://server之后)

http://server/b.html (把/a/b.html的/a去掉之后,拼接到http://server/之后)

要求

注意的是,对于location为正则表达式的匹配,proxy_pass的目标地址不可以带/

比如,如下配置会报错:

location ~ /abc(.*) {
    proxy_pass   http://127.0.0.1/x;
}


正则表达式的替换

如果是正则表达式,想要实现proxy_pass的路径替换,可以使用如下方式:

location ~ /abc(.*) { # 注意,使用这种方式,location内部不能包含if语句,否则proxy_pass不会生效
    proxy_pass   http://127.0.0.1/x$1;
}
如上可以把(.*)所匹配的内容拼接到http://127.0.0.1/abc之后,关于$1的使用,可以参考各种编程语言的正则表达式

另一种方法是:

location  /abc { # 这里也可以是正则
    proxy_pass http://127.0.0.1/x$request_uri;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
nginx中的location指令用于定义URI匹配规则,用于指定不同的配置块应用于不同的URI。 优先级表示了location配置块的匹配顺序,当请求到达nginx服务器时,nginx会依次遍历配置文件中的location配置块,然后使用第一个与请求URI匹配的location块进行处理。 具体来说,nginxlocation指令有两种形式:精确匹配和正则表达式匹配。 1. 精确匹配: location = /path { // 配置内容 } 这种形式表示对URI进行完全匹配,只有当请求的URI与指定的path完全相同时才会被匹配。 2. 前缀匹配: location /path { // 配置内容 } 这种形式表示对URI进行前缀匹配,只要请求的URI以指定的path开头就会被匹配到。 3. 正则表达式匹配: location ~* \.(jpg|jpeg|png)$ { // 配置内容 } 这种形式表示使用正则表达式进行URI匹配,只有当请求的URI符合指定的正则表达式时才会被匹配。 当有多个location配置块与请求的URI匹配时,nginx会按照以下优先级进行选择: 1. 精确匹配优先级最高,如果有精确匹配的location块与请求的URI完全匹配,就会选择该location块进行处理。 2. 如果没有精确匹配的location块,nginx会按照配置文件中location块的顺序从上到下依次匹配前缀匹配和正则表达式匹配的location块,选择第一个匹配的location块进行处理。 因此,当有多个location配置块与请求的URI匹配时,需要根据优先级和匹配规则来设置location配置块的顺序,以确保请求能够被正确地处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值