插件窝 干货文章 Nginx Location指令URI匹配规则是什么

Nginx Location指令URI匹配规则是什么

匹配 正则 location 规则 618    来源:    2025-04-25

Nginx的location指令用于匹配请求的URI,其匹配规则非常灵活且优先级明确。以下是详细的匹配规则和优先级说明:


1. 匹配语法

location [修饰符] 匹配模式 {
    # 配置内容
}

2. 匹配模式类型

(1) 精确匹配(=)

  • 语法location = /path
  • 规则:URI必须完全匹配指定路径。
  • 示例nginx location = /login { # 仅匹配 /login,不匹配 /login/ 或 /login?param=1 }

(2) 前缀匹配

  • 普通前缀匹配

    • 语法location /path
    • 规则:匹配以指定路径开头的URI(最长匹配优先)。
    • 示例
    location /static/ {
        # 匹配 /static/a.html、/static/images/logo.png 等
    }
    
  • ^~ 强制前缀匹配

    • 语法location ^~ /path
    • 规则:匹配以指定路径开头的URI,且不检查正则表达式(优先级高于正则)。
    • 示例
    location ^~ /images/ {
        # 匹配 /images/logo.png,但即使有正则规则 /img.*\.png 也不会检查
    }
    

(3) 正则表达式匹配

  • 区分大小写(~)

    • 语法location ~ /pattern/
    • 规则:区分大小写的正则匹配。
    • 示例
    location ~ \.php$ {
        # 匹配 /index.php,但不匹配 /INDEX.PHP
    }
    
  • 不区分大小写(~*)

    • 语法location ~* /pattern/
    • 规则:不区分大小写的正则匹配。
    • 示例
    location ~* \.(jpg|png)$ {
        # 匹配 /img.jpg 和 /IMG.PNG
    }
    

(4) 通用匹配(/)

  • 语法location /
  • 规则:匹配所有未被其他规则匹配的请求(最低优先级)。
  • 示例nginx location / { # 默认处理所有请求 }

3. 优先级规则

匹配优先级从高到低依次为: 1. 精确匹配(=
→ 最高优先级,直接命中后停止搜索。 2. 强制前缀匹配(^~
→ 命中后不检查正则表达式。 3. 正则表达式匹配(~~*
→ 按配置文件中的书写顺序匹配,先匹配到的生效。 4. 普通前缀匹配
→ 选择最长匹配的路径,若最长路径无^~修饰符,则继续检查正则。 5. 通用匹配(/
→ 默认兜底。


4. 示例解析

location = / {
    # 规则1:精确匹配首页
}

location ^~ /static/ {
    # 规则2:强制匹配/static/开头
}

location ~ \.html$ {
    # 规则3:匹配所有.html文件
}

location / {
    # 规则4:通用匹配
}
  • 请求 / → 命中规则1。
  • 请求 /static/logo.png → 命中规则2(跳过正则检查)。
  • 请求 /about.html → 命中规则3。
  • 请求 /unknown → 命中规则4。

5. 常见问题

  • 正则顺序敏感:若多个正则可能匹配同一URI,先定义的生效。
  • 性能优化:高频路径建议用^~=减少正则检查。
  • 斜杠问题/path/path/是不同的URI。

掌握这些规则后,可以精准控制Nginx的路由逻辑。如果需要更复杂的场景(如嵌套location或变量匹配),可进一步结合rewrite指令使用。