Nginx location配置类别和匹配优先级

Nginx location配置类别和匹配优先级
f9f73935e28c
IP属地: 江苏
0.203
2016.11.02 20:12:01
字数 693阅读 6,038
location功能:

匹配的ngnix变量:$request_uri
作用:定义url匹配模式,可以根据请求uri判断相应配置
配置文件中一般有多个location,分别定义了不同的匹配模式,不同的uri根据匹配结果获取不同的配置。
location的匹配模式:

location的匹配都是前缀匹配。格式:

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

分为3类:

精确模式:精确匹配(=)
前缀模式: 普通匹配(空格),非正则匹配(^~)
正则模式: 大小写敏感匹配(~),大小写不敏感匹配(~*),大小写敏感不匹配(!~),大小写不敏感不匹配(!~*)

location匹配优先级:

先匹配精确模式,命中精确模式,直接返回。否则,继续匹配前缀模式。
前缀模式中使用最大前缀原则,选出匹配普通匹配(空格)或非正则匹配(^~)的最长location。
若最长前缀location是非正则匹配(^~),则返回该最长前缀location。否则,还需要继续匹配正则模式。
正则模式的原则是按照正则location定义顺序匹配,第一个匹配的location为正则模式结果。
若正则模式匹配成功,返回正则模式结果。否则,返回前缀模式中的最长前缀location。
在nginx版本0.7.1 - 0.8.41中,若前缀模式的最长前缀location精确匹配uri,直接返回最长前缀location。

if 精确匹配结果
return 精确匹配结果
最长前缀结果 = longest: 普通匹配(空格) or 非正则匹配(^~)
if 最长前缀结果 属于 非正则匹配(^~)
return 最长前缀结果
if 版本 属于 0.7.1 - 0.8.41 and 最长前缀结果 == uri:
return 最长前缀结果
首个正则结果 = first: 大小写敏感匹配(~) or 大小写不敏感匹配(~) or 大小写敏感不匹配(!~) or 大小写不敏感不匹配(!~)
if 首个正则结果:
return 首个正则结果
else:
return 最长前缀结果

示例

location / {}

前缀模式,匹配所有uri,最短匹配
所以,这个location为兜底location。即当其他所有location都不匹配时,命中这个location。

location = / {
[ 配置 A ]
}

location / {
[ 配置 B ]
}

location /documents/ {
[ 配置 C ]
}

location ^~ /images/ {
[ 配置 D ]
}

location ~* .(gif|jpg|jpeg)$ {
[ 配置 E ]
}

uri:“/”
精确匹配:配置 A
uri:“/index.html”
兜底匹配:配置 B
uri:“/documents/document.html”
最长location匹配:配置 C
uri:“/images/1.gif”
非正则匹配:配置 D
uri:“/documents/1.jpg”
正则匹配:配置 E
内部location(@)

内部location不能被外部 Client 所访问,只能用于重定向。它不能被嵌套,也不能包含嵌套的location。格式为:

location @name {}

示例:

error_page 404 = @fallback
location @fallback {
}

特殊处理location

若前缀模式location以斜杠(/)结尾,并且请求设置由proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass或 memcached_pass等处理器处理,则使用该处理器处理。
但对于末尾不带斜杠的uri,这时会返回301并重定向到带斜杠的uri,继而匹配该location。

location /user/ {
proxy_pass http://user.example.com;
}

uri: /user/
转发到ttp://user.example.com
uri:/user
返回301,并重定向到/user/
如果不希望自动重定向,可以定义两个location,设置不同配置:

location /user/ {
proxy_pass http://user.example.com;
}
location = /user {
proxy_pass http://login.example.com;
}

uri:/user/
转发到http://user.example.com;
uri:/user
转发到http://login.example.com



转发自:https://www.jianshu.com/p/750cd0d0657a  侵删
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值