Nginx 的 location 路径匹配语法详解

本文系统梳理 location 的匹配规则、优先级顺序 ,并结合示例说明常见误区,帮助你在实际配置中做到可预测、可控

location 指令的匹配方式与优先级

Nginx 在接收到请求后,会按照固定的规则顺序location 进行匹配。

理解优先级,是正确配置的关键。

写法 示例 匹配方式 优先级
精确匹配 = location = /foo URI 必须完全一致 🥇 最高
前缀匹配 ^~ location ^~ /images/ 前缀匹配,且命中后不再进入正则匹配阶段 🥈 第二
前缀匹配(普通) location /foo 前缀匹配,多个命中时取最长前缀 🥉 第三
正则匹配 ~ location ~ .php$ 区分大小写的正则 🏅 第四(正则中按书写顺序)
正则匹配 ~* location ~* .jpg$ 忽略大小写的正则 同上
通用匹配 / location / 默认兜底 最低

实际匹配流程(简化版)

可以用一句话概括:

先精确 → 再前缀 → 再正则 → 最后兜底

更完整的逻辑是:

  1. 先检查是否存在 精确匹配 (=)
  2. 再检查所有 前缀匹配,记录最长的一个
  3. 如果该前缀是 ^~,直接命中并结束
  4. 否则进入 正则匹配(按配置顺序)
  5. 若正则未命中,则回退到最长的普通前缀匹配

常见配置示例

nginx 复制代码
server {
    # 1. 精确匹配:只匹配 /login
    location = /login {
        ...
    }

    # 2. 静态资源:前缀匹配并阻断正则
    location ^~ /static/ {
        root /web/data;
    }

    # 3. 正则匹配:处理 PHP 请求
    location ~ .php$ {
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    }

    # 4. 普通前缀匹配:API 转发
    location /api {
        proxy_pass http://api-backend;
    }

    # 5. 默认兜底
    location / {
        index index.html;
    }
}

📍 实践建议

  • 静态资源路径(如 /static//assets/)优先使用 ^~
  • API、页面路由多使用普通前缀匹配
  • 正则匹配谨慎使用,避免性能和可读性问题

易错点:proxy_pass 的路径拼接规则 ⚠️

proxy_pass 结尾有 /:替换 location 前缀
proxy_pass 结尾无 /:保留原始 URI

裁剪前缀(推荐用于 API 网关)

nginx 复制代码
location /api/ {
    proxy_pass http://backend/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

# /api/user/list  →  http://backend/user/list

不裁剪前缀

ruby 复制代码
location /api/ {
    proxy_pass http://backend;
}

# /api/user/list  →  http://backend/api/user/list

总结

  • location优先级不是配置顺序,而是语法规则
  • =^~ 是控制匹配行为的"利器"
  • 正则匹配应作为补充手段,而非主力方案
  • proxy_pass 是否带 /,直接决定请求路径是否被裁剪

参考

相关推荐
fatcoder1 小时前
玩转Nginx 04 — 反向代理:给 nginx 接上后端
前端·后端·nginx
fatcoder3 小时前
玩转Nginx 03 — location 匹配规则:让不同的路径各回各家
前端·后端·nginx
王坊兴5 小时前
Ubuntu 部署产品原型静态服务器:SFTP + Nginx
服务器·nginx·ubuntu
VIP_CQCRE5 小时前
Ace Data Cloud 两条变现路径:推广平台,还是做自己的白标 AI 平台?
ai·aigc·api·开发者·云服务
烬羽6 小时前
nginx 里写 localhost 反而 502?一条请求带你彻底搞懂 Docker 端口映射与反向代理
nginx·docker·程序员
小林ixn6 小时前
Docker + Nginx 反向代理:从“我电脑能跑”到“哪里都能跑”
nginx·docker·容器
运维全栈笔记6 小时前
Ubuntu 24.04 Certbot 自动化SSL证书配置指南
linux·运维·服务器·nginx·ubuntu·自动化·ssl
ly76897 小时前
负载均衡详解:从四层、七层到 LVS、Keepalived、Nginx 与 HAProxy
nginx·负载均衡·lvs
用户9385156350720 小时前
Docker + Nginx + Node.js:从“我的电脑能跑,你的电脑跑不了”到一键部署
后端·nginx·docker
teak_on_my_way1 天前
外网通过 Nginx 访问 Doris Stream Load:一次 HTTP 307 疑难排查与完整代理方案
运维·数据库·nginx·http