Nginx功能篇06—location匹配URI的优先级

概述

本章,您将学习到 Nginx 中 location 上下文匹配 URI 的优先级。

在介绍静态缓存时提到,location 匹配 URI 时,有两大类的匹配模式(通过不同的修饰符进行区别):

  • 前缀字符串

    • = - 精准匹配
    • ^~ - 优先前缀匹配
    • 无修饰符 - 普通前缀匹配,用来处理其他所有未明确匹配的请求。如 location / {...}location /images/ { ... }
  • 正则表达式

    • ~ - 区分大小写的正则表达式匹配
    • ~* - 不区分大小写的正则表达式匹配

说明如下表所示:

优先级(从高到低) 修饰符 匹配类型 特征
1 = 精准匹配 URI 必须与路径完全一致。命中即停止匹配,不再检查其他任何规则
2 ^~ 优先前缀匹配 匹配以指定字符串开头的 URI。若它是当前所有前缀匹配中‌最长‌的,则命中即停止,‌跳过‌后续所有正则匹配
3 ~~* 正则表达式匹配 按配置文件中‌书写的先后顺序‌逐个测试。一旦找到第一个匹配的正则时,立即停止搜索并应用该匹配规则
4 普通前缀匹配 匹配以指定字符串开头的 URI。在所有前缀匹配中选择‌最长‌的一个。仅当没有 =^~ 或正则匹配成功时,才使用此结果作为兜底
注意
在无嵌套关系的情况下,新手容易按照 location 上下文的书写顺序来定义匹配 URI 的优先级,这是错误的。

匹配 URI 的执行流程

当用户的请求到达了 Nginx 时,Nginx 的内部处理逻辑可大致划分为三个阶段:

阶段一:检查精准匹配(=)

Nginx 会检查用户请求的 URI 是否与 location = /NAME/ { ... } 完全相同,若相同,直接应用该匹配规则并结束搜索(也就是所谓的匹配即停止原则),否则进入到阶段2。

阶段二:检查其他的前缀字符串(^~ 和无修饰符)

Nginx 会遍历所有前缀字符串的 location 上下文,找出与请求 URI 匹配‌最长‌的那个规则,即所谓的最长匹配原则

  • 情况A - 如果最长匹配的 location 上下文使用了 ^~ 修饰符,Nginx 会立即使用该匹配规则并结束搜索
  • 情况B - 如果最长匹配的 location 上下文没有使用 ^~ 修饰符,Nginx 会‌暂时记住‌这条匹配规则,但‌继续‌进入到阶段三

阶段三:检查正则表达式(~ 和 ~*)

Nginx 会按照配置文件中的书写顺序从上到下逐个测试各个使用正则表达式修饰符的 location:

  • 若存在匹配成功的正则表达式 ,则结束搜索;
  • 若所有正则表达式都不匹配,则会回退到阶段二的情况B并应用那条匹配规则。

上面的文字可能会让读者难以理解,我们利用以下的具体案例来说明。

具体案例

假设 nginx.conf 的内容如下:

...
http {
    ...
    server {
        location = / {
            echo "规则 A ";
        }

        location = /login/ {
            echo "规则 B ";
        }

        location ^~ /static/ {
            echo "规则 C ";
        }

        location ^~ /static/files/ {
            echo "规则 X ";
        }

        location ~ \.(gif|jpg|png|js|css)$ {
            echo "规则 D ";
        }

        location ~* \.png$ {
            echo "规则 E ";
        }

        location /img/ {
            echo "规则 Y ";
        }

        location / {
            echo "规则 F ";
        }
    }
    ...
}
...
Avatar photo

关于 陸風睿

GNU/Linux 从业者、开源爱好者、技术钻研者,撰写文档既是兴趣也是工作内容之一。Q - "281957576";WeChat - "jiulongxiaotianci",Github - https://github.com/jimcat8
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇