3. nginx location 匹配优先级问题

官方文档翻译工

Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default:
Context: server, location

匹配是针对标准化的URI进行的,对编码为“%XX”格式的文本进行解码,解决相对路径组件“.”和“..”的引用,并可能将两个或多个相邻斜杠压缩为单个斜杠。

位置可以通过前缀字符串或正则表达式来定义。正则表达式用前置“~ *”修饰符(用于不区分大小写的匹配)或“〜”修饰符(用于区分大小写的匹配)指定。为了找到与给定请求匹配的位置,nginx首先检查使用前缀字符串(前缀位置)定义的位置。其中,选择并记住具有最长匹配前缀的位置。然后按照正则表达式在配置文件中出现的顺序检查正则表达式。正则表达式的搜索在第一次匹配时终止,并使用相应的配置。如果没有找到与正则表达式匹配的结果,则使用先前记住的前缀位置的配置。
location可以嵌套,但有一些例外情况。

对于像macOS和Cygwin这样不区分大小写的操作系统,使用前缀字符串进行匹配会忽略大小写(0.7.7)。但是,比较仅限于单字节语言环境。

正则表达式可以包含捕获(0.7.40),稍后可以在其他指令中使用。

如果具有最长匹配前缀位置的“^〜”修饰符,则不会检查正则表达式。此外,使用“=”修饰符可以定义URI和位置的精确匹配。如果找到精确匹配,则搜索终止。例如,如果“ /”请求经常发生,则定义“位置= /”将加快这些请求的处理,因为搜索在第一次比较后立即终止。这样的位置显然不能包含嵌套位置。

“@”前缀定义了一个命名位置。这样的位置不用于常规请求处理,而是用于请求重定向。它们不能嵌套,并且不能包含嵌套位置。

posted @ 2023-05-31 11:25  萱乐庆foreverlove  阅读(28)  评论(0编辑  收藏  举报