Ngnix中location与proxy_pass配置规则总结

1.location匹配变量与配置格式

location配置用于匹配请求的URL,即ngnix中的$request_uri变量

$request_uri

location配置格式:

location [ 空格 | = | ~ | ~* |^~|!~ | !~* ] /uri/ {}

2.loacation匹配顺序

location 匹配格式规则前缀有四种:

  • = 开头,表示精确匹配
  • ^~ 开头,注意这不是一个正则表达式–它的目的是优于正则表达式的匹配;如果该location是最佳匹配,则不再进行正则表达式检测。
  • ~ 开头,表示区分大小写的正则匹配;
  • ~* 开头,表示不区分大小写的正则匹配
  • !~ && !~*:表示区分大小写不匹配的正则和不区分大小写的不匹配的正则

location 如果不带前缀就是普通字符串匹配:

  • /uri/ 普通字符串匹配
  • / 绝对路径根目录匹配, 如果没有其它匹配,任何请求都会匹配到

匹配的搜索顺序优先级为:

(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)
  1. 首先匹配=

  2. 其次匹配^~

  3. 再其次按照配置文件的顺序进行正则匹配

  4. 最后是交给/进行通用匹配

注意:

  • 当有匹配成功时,立刻停止匹配,按照当前匹配规则处理请求

特别注意:

  • 优先搜索并不意味着优先命中!
  • 字符串匹配优先搜索,但是只是记录下最长的匹配 ( 如果 ^~ 是最长的匹配,则会直接命中,停止搜索正则 ),然后继续搜索正则匹配,如果有正则匹配,则命中正则匹配,如果没有正则匹配,则命中最长的字符串匹配。

匹配模式及顺序举例:

  • location = /uri    =开头表示精确匹配,只有完全匹配上才能生效。
  • location ^~ /uri   ^~ 开头对URL路径进行前缀匹配,并且在正则之前。
  • location ~ pattern  ~开头表示区分大小写的正则匹配。
  • location ~* pattern  ~*开头表示不区分大小写的正则匹配。
  • location /uri     不带任何修饰符,也表示前缀匹配,但是在正则匹配之后,如果没有正则命中,命中最长的规则。
  • location /      通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default。

3.location与proxy_pass代理规则

3.1 location是否以“/”结尾

在ngnix中location进行的是模糊匹配

  1. 没有“/”结尾时,location/abc/def可以匹配/abc/defghi请求,也可以匹配/abc/def/ghi等
  2. 而有“/”结尾时,location/abc/def/不能匹配/abc/defghi请求,只能匹配/abc/def/anything这样的请求

3.2 proxy_pass是否以“/”结尾

在nginx中配置proxy_pass时,当在后面的url加上了/,相当于是绝对路径,则nginx不会把location中匹配的路径部分加入代理uri;如果没有/,则会把匹配的路径部分加入代理uri。

1.如果proxy_pass的URL定向里包括URI,那么请求中匹配到location中URI的部分会被proxy_pass后面URL中的URI替换:

location /name/ {
    proxy_pass http://127.0.0.1/remote/;
}
# 请求http://127.0.0.1/name/test.html 会被代理到http://example.com/remote/test.html

2.如果proxy_pass的URL定向里不包括URI,那么请求中的URI会保持原样传送给后端server:

location /name/ {
    proxy_pass http://127.0.0.1;
}

# 请求http://127.0.0.1/name/test.html 会被代理到http://127.0.0.1/name/test.html

3.一些情况下,不能确定替换的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;
}

参考:
https://www.cnblogs.com/coder-yoyo/p/6346595.html
https://blog.csdn.net/heiyueya/article/details/70149270
http://blog.51cto.com/huangzp/1954575
https://www.cnblogs.com/luxianghao/p/6807081.html

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值