玩转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 | 谁都没抢到 → 兜底 |
关键结论
^~的免检特权 :/static/index.html同时满足/static/前缀和\.html$正则,但^~赢了------命中即停,不给正则机会。- 正则压过普通前缀 :
/index.html同时匹配location /(普通前缀)和\.html$(正则),正则赢------普通前缀是"最后防线"。 =是最高法庭 :/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/ |
看柜台营业名单(软链接指向) |
八、易错点
- 正则里的
.要转义 :\.html$(.是通配符,\.才是字面点) ^~与普通前缀的区别 :^~命中不查正则;普通前缀命中后还要看正则(正则优先)- 正则按书写顺序:多个正则时第一个命中生效,顺序写错结果就错
location /只兜底:它是最短前缀,永远最后才轮到(除非正则都没有)- 软链接 vs 复制 :配置用
ln -s挂柜台,不要复制(复制会两边不同步) return调试完要撤:产品配置里别留调试文本
九、一句话总结
location 是分诊台:
=一锤定音、^~截胡免检、~正则先到先得、普通前缀最长者胜、最后location /兜底;location 里装什么指令就干什么活------静态用 root,动态用 proxy_pass(下一课)。
十、下一课预告
第 4 课:反向代理 ------ 给 nginx 接上后端 🔄
- 什么是反向代理:nginx 把
/api/的请求整个转发给后端程序,把响应带回来 proxy_pass配置实战:让/api/真实转发给一个跑着的小后端服务- 静态 + 动态混合编排:
/static/自己发、/api/转发------完整的前后端分离形态 - 学完你就拥有生产环境的标准架构:浏览器 → nginx → 后端服务