全网最show nginx location匹配过程

1,516 阅读1分钟

语法

location 规则 uri

规则 就是对uri的修饰

  1. ”=” uri不能为正则 只能是字符窜 一旦命中 立即停止

  2. ”~” 表示uri包含正则,并且区分大小写 就说如果你的uri是正则写的 一定要有~

  3. “~”表示uri包含正则,但不区分大小写 就说如果你的uri是正则写的 一定要有~

  4. ”^~” 模糊匹配 不会匹配正则 一旦命中就停止 不会去匹配正则

举例

 1. location /juejing {
    return 100;
}

2. location = /juejin {
    return 101;
}

3.location ^~ /juexi {
    return 104;
}

4.location ^~ ^/jue$ {
    return 105;
}

5.location ~* ^/JUEJIN09$ {
    return 106;
}

6.location ~* /juejing$ {
    return 107;
}

匹配流程

先进行把uri 进行精确匹配 模糊匹配 还有没有修饰的匹配(如 location /juejing 前面没修饰符) 如果命中精确匹配或者模糊匹配立即停止(精确匹配优先度最高) 获取到一个最长匹配(匹配到半个的不算)跟正则匹配对比 如果命中了正则的 则使用正则 没命中 则拿到最长的那个规则

比如我访问/juejing curl -I 域名/juejing
先看精确匹配 =/juejin 不匹配
模糊匹配^~ /juexi 不匹配
^~ ^/jue$ 不匹配 因为模糊匹配不走正则所以写了也没用
第1个 /juejing 然后也是最长的匹配 然后去匹配 5 6 的正则 第5个不匹配 第6个匹配 所以 返回107 如果(我说的是如果)第六个也不匹配 那么就返回第一个的 return 100

如果都没匹配 那么就返回404

总结

先进行普通匹配 也就是不是正则匹配的那种 如果是精确匹配或者模糊匹配 命中了 就停止
这里是书写顺序的
然后拿到符合匹配的uri最长的那个 也就是最符合的那个 去匹配正则 正则是有顺序的 一旦命中了 就停止 如果没命中正则 则返回最长的那个