插件窝 干货文章 Nginx路径匹配规则是什么

Nginx路径匹配规则是什么

匹配 location 正则 优先级 805    来源:    2025-04-22

Nginx 的路径匹配规则是其配置中的核心机制,主要通过 location 指令实现。以下是详细的规则解析和优先级说明:


1. 匹配规则分类

Nginx 的路径匹配分为 精确匹配前缀匹配正则匹配通用匹配,优先级依次降低。

1.1 精确匹配 (=)

  • 语法: location = /path { ... }
  • 规则: 完全匹配请求路径(区分大小写)。
  • 示例: nginx location = /login { # 仅匹配 /login,不匹配 /login/ 或 /login.html proxy_pass http://backend; }
  • 优先级: 最高(若匹配成功,直接生效)。

1.2 前缀匹配

  • 普通前缀匹配 (/path):

    • 语法: location /prefix { ... }
    • 规则: 匹配以 /prefix 开头的路径(最长匹配原则)。
    • 示例:
    location /static/ {
        # 匹配 /static/a.html、/static/images/logo.png 等
        alias /data/static/;
    }
    
  • ^~ 强制前缀匹配:

    • 语法: location ^~ /prefix { ... }
    • 规则: 匹配以 /prefix 开头的路径,且阻止后续正则匹配
    • 示例:
    location ^~ /images/ {
        # 匹配 /images/logo.png,但不检查后续正则
        root /data;
    }
    
    • 优先级: 高于正则匹配(类似精确匹配的降级版)。

1.3 正则匹配 (~~*)

  • 区分大小写 (~):

    location ~ \.php$ {
      # 匹配 /index.php,但不匹配 /index.PHP
      fastcgi_pass php:9000;
    }
    
  • 不区分大小写 (~*):

    location ~* \.(jpg|png)$ {
      # 匹配 /logo.JPG 和 /icon.png
      expires 30d;
    }
    
  • 优先级: 按配置文件中的声明顺序匹配(第一条匹配的正则生效)。

1.4 通用匹配 (/)

  • 语法: location / { ... }
  • 规则: 匹配所有未被其他规则匹配的请求。
  • 示例: nginx location / { # 兜底规则(最低优先级) try_files $uri $uri/ /index.html; }

2. 优先级总览

从高到低排序: 1. 精确匹配 (=) → 2. 强制前缀匹配 (^~) → 3. 正则匹配 (~/~*) → 4. 普通前缀匹配 → 5. 通用匹配 (/)


3. 特殊案例与注意事项

3.1 结尾斜杠 (/) 的影响

  • location /dir 会匹配 /dir/dir/
  • 若需严格区分,建议显式配置: nginx location /dir/ { # 仅匹配以 /dir/ 开头的路径 }

3.2 正则匹配的性能

  • 正则匹配效率低于前缀匹配,高频路径建议用 ^~= 优化。

3.3 aliasroot 的区别

  • root 会拼接完整路径(root + location): nginx location /static/ { root /data; # 文件路径: /data/static/a.jpg }
  • alias 直接替换路径: nginx location /static/ { alias /data/; # 文件路径: /data/a.jpg }

4. 调试技巧

  • 使用 echo 模块或日志打印匹配结果: nginx location /test { add_header X-Matched $uri; return 200 "Matched: $uri"; }
  • 通过 nginx -T 检查配置完整性。

掌握这些规则后,可以高效配置 Nginx 实现精确的路由控制。遇到复杂场景时,建议通过优先级顺序逐步验证匹配逻辑。