Nginx 中 location 指令的匹配规则是什么?

推荐答案

在 Nginx 中,location 指令用于匹配请求的 URI,并根据匹配结果决定如何处理请求。location 指令的匹配规则如下:

  1. 精确匹配:使用 = 前缀进行精确匹配。例如:

  2. 前缀匹配:使用 ^~ 前缀进行前缀匹配,且匹配成功后不再进行正则表达式匹配。例如:

  3. 正则表达式匹配:使用 ~~* 前缀进行正则表达式匹配。~ 表示区分大小写,~* 表示不区分大小写。例如:

  4. 普通前缀匹配:没有前缀的 location 指令进行普通前缀匹配。例如:

  5. 匹配优先级:Nginx 会按照以下优先级顺序进行匹配:

    • 精确匹配 (=) 优先级最高。
    • 前缀匹配 (^~) 优先级次之。
    • 正则表达式匹配 (~~*) 优先级较低。
    • 普通前缀匹配优先级最低。

本题详细解读

1. 精确匹配 (=)

精确匹配使用 = 前缀,只有当请求的 URI 与 location 中定义的路径完全一致时,才会匹配成功。精确匹配的优先级最高,一旦匹配成功,Nginx 将立即停止后续的匹配过程。

示例:

  • 请求 /exact-match 会匹配成功。
  • 请求 /exact-match//exact-match/other 不会匹配。

2. 前缀匹配 (^~)

前缀匹配使用 ^~ 前缀,匹配以指定路径开头的 URI。与普通前缀匹配不同,前缀匹配成功后,Nginx 不会继续尝试正则表达式匹配。

示例:

  • 请求 /prefix/prefix/other 会匹配成功。
  • 请求 /prefix-match 不会匹配。

3. 正则表达式匹配 (~~*)

正则表达式匹配使用 ~~* 前缀,~ 表示区分大小写,~* 表示不区分大小写。正则表达式匹配的优先级低于精确匹配和前缀匹配。

示例:

  • 请求 /index.php 会匹配成功。
  • 请求 /index.PHP 不会匹配(除非使用 ~*)。

4. 普通前缀匹配

没有前缀的 location 指令进行普通前缀匹配。普通前缀匹配的优先级最低,只有在没有其他更高优先级的匹配时,才会使用普通前缀匹配。

示例:

  • 请求 //any/any/path 都会匹配成功。

5. 匹配优先级

Nginx 的 location 匹配优先级如下:

  1. 精确匹配 (=)
  2. 前缀匹配 (^~)
  3. 正则表达式匹配 (~~*)
  4. 普通前缀匹配

Nginx 会按照上述优先级顺序依次尝试匹配,一旦匹配成功,就会停止后续的匹配过程。

纠错
反馈