Nginx Location 路径匹配

Nginx 通过不同的 location 配置来匹配访问的 uri. 这样便可以做到对不同的 uri 执行不同的操作.

location 的路径匹配可以分为两种: 前缀匹配和正则匹配, 基本语法为:

location [ = | ~ | ~* | ^~ ] uri {
    ... 
}
复制代码

其中, =, ^~, ~~*分别表示:
=: 精确匹配 => 前缀匹配;
^~: 优先前缀匹配 => 前缀匹配;
~: 正则匹配(大小写敏感) => 正则匹配;
~*: 正则匹配(大小学不敏感) => 正则匹配;

匹配规则

  1. 首先检查使用前缀匹配的 location, 找到最长匹配项并且记录下来
  2. 如果找到了精确匹配的 location(=), 则结束查找, 直接使用该 location 的配置; 如果最长匹配的 location 是优先前缀匹配(^~), 也结束查找, 使用该 location 的配置
  3. 然后按照顺序检查使用正则匹配的 location, 一旦匹配则结束查找, 直接使用匹配的 location 的配置
  4. 如果找完所有的正则匹配后还是没有匹配到, 则采用前缀匹配查找时记录下来的的最长匹配项的 location 的配置
栗子:
location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}
复制代码

以上配置中:
/: 精确匹配 A, 则直接采用配置 A, 不再继续检查.
/index.html: 首先检查前缀匹配, 最长匹配为 B; 然后检查正则匹配, 未匹配到, 则采用配置 B.
/documents/documents.html/: 首先检查前缀匹配, 最长匹配为 C; 然后检查正则匹配, 未匹配到, 则采用配置配 C.
/images/pic.jpg: 首先检查前缀匹配, 匹配到最长匹配为 D, 此时 D 为优先前缀匹配, 不再继续检查, 直接采用配置 D;
/documents/pic.jpg: 首先检查前缀匹配, 最长匹配为 C; 然后按照顺序检查正则匹配, 匹配了 E, 则停止检查, 直接采用配置 D'

前缀匹配中的 slash 后缀

如果在 location 前缀匹配中以斜线 / 结尾, 并且 location 中的配置为proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass 或者 grpc_pass 中的一个. 在访问的时候如果没有斜线结尾, 那么 Nginx 会默认返回带斜线的 301 重定向. 比如:

location /doc-1/ {
    proxy_pass http://localhost:3000;
}
复制代码

不带 slash 访问

带slash 访问

但是如果在配置 location 的时候没有以斜杠结尾, 造成的结果是当你以加斜杠的 uri 去访问的时候, Nginx 无法匹配该 uri.

location /doc-2 {
    proxy_pass http://localhost:3000;
}
复制代码

不带 slash 访问

带 slash 访问

参考:
ngx_http_core_module.html#location

转载于:https://juejin.im/post/5be19053e51d455bad08a342

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
nginx中,location指令用于匹配请求的URI,以便决定如何处理这个请求。location指令可以接受一个字符串参数,也可以接受一个正则表达式作为参数。 以下是nginx location路径匹配规则: 1. 以“=”开头的location指令表示严格匹配,只有当请求的URI与location指令的参数完全一致时,才会匹配成功。 2. 如果location指令的参数是一个目录名称,例如“/user/”,那么匹配规则如下: - 如果请求的URI是“/user/”,那么匹配成功。 - 如果请求的URI是“/user”(没有斜杠结尾),那么nginx会自动将其转换为“/user/”,然后再进行匹配。 - 如果请求的URI是“/user/login”,那么匹配成功,因为“/user/login”包含“/user/”这个目录名称。 3. 如果location指令的参数是一个正则表达式,例如“~^/user/(.*)$”,那么匹配规则如下: - 如果请求的URI与正则表达式匹配成功,那么这个location指令就匹配成功。 - 正则表达式中可以使用捕获组,例如“~^/user/(\d+)/(\w+)$”表示匹配形如“/user/123/abc”的URI,并将“123”和“abc”作为变量传递给后端处理程序。 4. 如果location指令的参数是“/”,那么这个location指令会匹配所有请求。 5. 如果存在多个location指令,nginx会按照定义的顺序依次进行匹配,直到找到第一个匹配成功的location指令为止。 需要注意的是,nginxlocation匹配规则是从上到下依次匹配的,一旦匹配成功就不再继续匹配。因此,如果存在多个location指令,需要注意定义的顺序,避免出现匹配错误的情况。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值