玩转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 → 后端服务
相关推荐
YWL1 分钟前
OpenLayers弹窗Overlay深度实战
前端·vue·openlayers
YWL31 分钟前
OpenLayers+ECharts联动:地图点击联动图表,数据可视化大屏方案
前端·信息可视化·vue·echarts·openlayers
芭拉拉小魔仙37 分钟前
Vue 2 门诊收费系统中的医保结算流程设计与实践
前端·javascript·vue.js
moonrailgun44 分钟前
用 Node.js 复刻 Codex Astra 的终端星光
前端·javascript·算法
海上彼尚1 小时前
Cursor 模型的强度实测排行
前端·人工智能·后端
默_笙1 小时前
💫 给金鱼建图书馆(下):Milvus 向量数据库,让 AI 拥有长期记忆
前端·javascript
EatFan2 小时前
HTML前端利用flex解决input定位的问题
前端·css·html·css3
GoGeekBaird2 小时前
从「跑完即销毁」到「用完再销毁」:云沙箱的一次进化
后端·github·ai编程
孫治AllenSun2 小时前
【LangChain4J-09】开发学习知识点
spring boot·后端·学习
CoderYanger3 小时前
前端基础——JavaScript(WebAPI)(下篇)
java·开发语言·前端·javascript·程序人生·面试·职场和发展