玩转Nginx 03 — location 匹配规则:让不同的路径各回各家

玩转Nginx 03 --- location 匹配规则:让不同的路径各回各家

一、本课目标

一个 server{} 里可以有多个 location,本课搞清:请求路径是怎么被分诊到不同 location 的------四种匹配类型、优先级规则、现场实验验证。


二、心智模型:分诊台

bash 复制代码
请求进来 ──▶ 分诊台(location 匹配)
                ├─ = /exact       → 精确包间(只接这一个)
                ├─ ^~ /static/    → 带帽前缀包间(凡是 /static/ 开头的都进)
                ├─ ~ \.html$      → 正则包间(.html 结尾的进)
                └─ /              → 大厅兜底(其他所有)

为什么需要分诊?真实站点不同路径要不同待遇:/images/ 走缓存、/api/ 转后端、/ 兜底发页面。一条 location 干一件事,各司其职


三、匹配优先级(本课核心,死记)

写法 名字 规则 口诀
location = /x 精确匹配 命中立刻生效,不再看任何其他 一锤定音
location ^~ /x/ 带帽前缀 命中直接停,不查正则 截胡选手
location ~ 正则 正则匹配 按书写顺序,第一个命中的生效 先到先得
location /x 普通前缀 最长的(只在没有正则命中时生效) 最长者胜
都没有 404

正则的 ~ 区分大小写,~* 不区分。


四、实验台:site2(8081 端口)

专用实验站点,每个 location 用 return 200 "文本" 直接返回一句话,不需要任何文件,纯粹看匹配规则。

nginx 复制代码
server {
    listen 8081;
    server_name _;

    location = /exact {
        return 200 "EXACT 精确匹配命中\n";
    }

    location ^~ /static/ {
        return 200 "PREFIX 带帽前缀命中: /static/ 开头\n";
    }

    location ~ \.html$ {
        return 200 "REGEX 正则命中: .html 结尾\n";
    }

    location / {
        return 200 "DEFAULT 兜底命中\n";
    }
}

新指令 return 200 "文本" = 直接返回一段文本(调试/拦截利器,排查 location 的首选手法)。


五、实验记录与结果解读

请求 命中 验证的规则
GET /exact EXACT = 精确匹配:一锤定音
GET /static/111 PREFIX ^~ 前缀匹配
GET /static/index.html PREFIX 🎯 ^~ 截胡 :它虽以 .html 结尾(正则也想接),但 ^~ 命中后直接停手不查正则
GET /index.html REGEX 正则优先于普通前缀:先到先得
GET /abc DEFAULT 谁都没抢到 → 兜底

关键结论

  1. ^~ 的免检特权/static/index.html 同时满足 /static/ 前缀和 \.html$ 正则,但 ^~ 赢了------命中即停,不给正则机会。
  2. 正则压过普通前缀/index.html 同时匹配 location /(普通前缀)和 \.html$(正则),正则赢------普通前缀是"最后防线"。
  3. = 是最高法庭/exact 若还有别的匹配(比如正则),= 直接拍板。

六、location 里装的指令(预告:不同的活)

return "文字" 只是调试哑标签。真实世界里 location 里装处理指令

nginx 复制代码
location /static/ {
    root /var/www/static;            # 指令一:发这个目录的静态文件
}
location /api/ {
    proxy_pass http://127.0.0.1:8000;   # 指令二:整个转发给后端(反向代理,第 4 课)
}
location 里装的指令 干的活
root / alias 发静态文件(第 2 课学过 root)
proxy_pass 转发给另一个服务(反向代理)
return / rewrite 直接回应 / 改地址

完整形态:/static/ 自己发文件、/api/ 转发后端、其余兜底------一个 server{} 编排整套混合服务。


七、命令清单(本课新增)

命令/指令 作用
return 200 "文本" location 里直接返回文本(调试首选)
ln -s 源 目标 建软链接(快捷方式)
ls -l /etc/nginx/sites-enabled/ 看柜台营业名单(软链接指向)

八、易错点

  1. 正则里的 . 要转义\.html$. 是通配符,\. 才是字面点)
  2. ^~ 与普通前缀的区别^~ 命中不查正则;普通前缀命中后还要看正则(正则优先)
  3. 正则按书写顺序:多个正则时第一个命中生效,顺序写错结果就错
  4. location / 只兜底:它是最短前缀,永远最后才轮到(除非正则都没有)
  5. 软链接 vs 复制 :配置用 ln -s 挂柜台,不要复制(复制会两边不同步)
  6. return 调试完要撤:产品配置里别留调试文本

九、一句话总结

location 是分诊台:= 一锤定音、^~ 截胡免检、~ 正则先到先得、普通前缀最长者胜、最后 location / 兜底;location 里装什么指令就干什么活------静态用 root,动态用 proxy_pass(下一课)。


十、下一课预告

第 4 课:反向代理 ------ 给 nginx 接上后端 🔄

  • 什么是反向代理:nginx 把 /api/ 的请求整个转发给后端程序,把响应带回来
  • proxy_pass 配置实战:让 /api/ 真实转发给一个跑着的小后端服务
  • 静态 + 动态混合编排:/static/ 自己发、/api/ 转发------完整的前后端分离形态
  • 学完你就拥有生产环境的标准架构:浏览器 → nginx → 后端服务
相关推荐
HjhIron1 小时前
前端面试高频考点 —— TS 高级类型 & CSS 三列布局
前端
wno7041 小时前
Spring Boot JdbcTemplate配置Druid多数据源
java·spring boot·后端
月才1 小时前
Spring Boot 接口参数校验从入门到精通
后端
码农大叔的博客1 小时前
golang示例:switch
开发语言·后端·golang
李剑一1 小时前
《牛来》火了?我用ThreeJs实现了一个简易版的,代码全送给你,文章最后附演示效果
前端
Zane19941 小时前
多开几个线程,为什么算数字反而没变快?一文讲透 CPython 的 GIL
后端·python
一只叫煤球的猫1 小时前
Spring AI 2.0 源码解析(二):Starter 如何自动装配 ChatClient ?
后端·面试·langchain
饼干哥哥1 小时前
重生之我是导演:爆改成「牛来版」黑客帝国?附3D预演台保姆级教程!
人工智能·后端·深度学习
MacroZheng1 小时前
完美替代 Navicat!这款内置 AI 的数据库工具,太香了!
java·后端·mysql