Nginx location匹配模式详解

发布于:2025-05-29 ⋅ 阅读:(15) ⋅ 点赞:(0)

以下是对 Nginx location 匹配模式的详细说明及代码示例,包含注释解析:


1. 精确匹配(Exact Match)

语法: location = /path { ... }
优先级: 最高,仅当请求路径与 /path 完全一致时触发。

location = /login {
    # 仅匹配 `/login` 路径(区分大小写)
    # 例如:https://example.com/login
    proxy_pass http://backend/login;
}

2. 前缀匹配(Prefix Match)

普通前缀匹配

语法: location /prefix { ... }
优先级: ,按配置文件顺序匹配,但可能被正则匹配覆盖。

location /static/ {
    # 匹配以 `/static/` 开头的路径,如 `/static/css/style.css`
    # 但如果没有 `^~` 修饰符,可能被后续正则匹配覆盖
    root /var/www/html;
}
优先前缀匹配

语法: location ^~ /prefix { ... }
优先级: 中高,匹配以 /prefix 开头的路径,且不再检查后续正则匹配

location ^~ /images/ {
    # 匹配以 `/images/` 开头的路径,如 `/images/logo.png`
    # 即使后续有正则匹配 `/images/.*\.png`,此配置仍优先
    root /data;
}

3. 正则匹配(Regular Expression Match)

区分大小写的正则

语法: location ~ /regex/ { ... }
优先级: ,按正则出现的顺序匹配,第一个匹配成功的生效。

location ~ \.php$ {
    # 匹配以 `.php` 结尾的路径(区分大小写),如 `/index.php`
    # 不会匹配 `/index.PHP`
    fastcgi_pass php:9000;
}
不区分大小写的正则

语法: location ~* /regex/ { ... }
优先级: ,同上,但忽略大小写。

location ~* \.(jpg|png|gif)$ {
    # 匹配 `.jpg`, `.png`, `.gif` 结尾的路径,不区分大小写
    # 如 `/image.JPG` 或 `/image.jpg`
    expires 30d;
}

4. 最长前缀匹配(Longest Prefix Match)

语法: location /longest/possible/path { ... }
优先级: ,当无精确或正则匹配时,选择最长前缀路径。

location /documents/ {
    # 匹配 `/documents/` 开头的路径,如 `/documents/report.pdf`
    root /var/data;
}

location /documents/reports/ {
    # 更长的前缀,如 `/documents/reports/2023.pdf`
    root /var/special-data;
}

优先级总结

优先级从高到低排序:

  1. 精确匹配 (location = /path)
  2. 优先前缀匹配 (location ^~ /prefix)
  3. 正则匹配 (location ~ /regex/location ~* /regex/)
  4. 普通前缀匹配 (location /path)

完整示例配置

server {
    listen 80;
    server_name example.com;

    # 1. 精确匹配(最高优先级)
    location = /logo.png {
        root /var/www/exact;
    }

    # 2. 优先前缀匹配(次高优先级)
    location ^~ /static/ {
        root /var/www/static;
    }

    # 3. 正则匹配(区分大小写)
    location ~ /user/\d+ {
        proxy_pass http://user_backend;
    }

    # 4. 正则匹配(不区分大小写)
    location ~* \.(js|css)$ {
        root /var/www/assets;
    }

    # 5. 普通前缀匹配(最低优先级)
    location / {
        root /var/www/default;
    }
}

匹配过程解析

  1. 请求 /logo.png → 命中 location = /logo.png(精确匹配)。
  2. 请求 /static/css/style.css → 命中 location ^~ /static/(优先前缀匹配)。
  3. 请求 /user/123 → 命中 location ~ /user/\d+(正则匹配)。
  4. 请求 /IMAGE.JPG → 命中 location ~* \.(js|css)$(不区分大小写的正则匹配)。
  5. 请求 /about → 命中 location /(普通前缀匹配)。

调试技巧

  • 使用 nginx -T 查看完整配置。
  • 通过 error_log logs/error.log debug; 启用调试日志。
  • 在线工具测试正则:Nginx Location Tester

通过理解这些规则,可以更精准地控制 Nginx 的路由逻辑!


网站公告

今日签到

点亮在社区的每一天
去签到