Nginx匹配URI主要依靠location块与rewrite指令协同:location按=、^~、正则、前缀优先级匹配并决定处理逻辑,rewrite在匹配后的location内对URI路径进行PCRE重写,需注意作用域、解码状态及避免循环。

匹配 URI 主要用 location 块和 rewrite 指令配合,核心在于理解匹配顺序、语法差异和常见写法。
location 匹配 URI 的基本写法
location 是 Nginx 解析请求 URI 的第一道关卡,它不改写 URI,但决定后续处理逻辑(比如是否进 rewrite)。
-
前缀匹配:如
location /api/ { ... },匹配以/api/开头的所有 URI(如/api/user、/api/v1/xxx) -
正则匹配:用
~(区分大小写)或~*(不区分大小写),例如location ~* \.(jpg|png|gif)$ { ... }匹配图片后缀 -
精确匹配:用
=,如location = /health { ... }只匹配/health这个完整路径,不带查询参数也不带尾部斜杠 - 注意优先级:
=>^~(最长前缀且不进正则) > 正则(按配置顺序第一个命中即停) > 普通前缀
rewrite 指令中的 URI 匹配写法
rewrite 本身不直接“匹配 URI”,而是对 已进入该 location 块的请求 URI 进行重写。它的 pattern 是 PCRE 正则,作用对象是 请求的 URI 路径部分(不含协议、域名、查询字符串)。
- 例如:
rewrite ^/old/(.*)$ /new/$1 permanent;将/old/page.html→/new/page.html,$1捕获old/后的内容 - URI 中的查询参数默认保留,除非显式用
?截断,如rewrite /search /list? permanent;会丢弃原 query - 常用标志:
last(内部重定向,重新匹配 location)、break(停止当前 location 的 rewrite,不重新匹配)、redirect(302)、permanent(301)
实际常用组合场景
多数需求靠 location + rewrite 协同完成,避免在 rewrite 中做复杂判断。
-
统一移除尾部斜杠:
location ~ ^(.+)/$ {<br> rewrite ^(.+)/$ $1 permanent;<br>} -
API 版本前缀重写:
location ^~ /v1/ {<br> rewrite ^/v1/(.*)$ /api/$1 break;<br> proxy_pass http://backend;<br>} -
忽略某些前缀但保留真实路径:
location /static/ {<br> alias /data/assets/;<br>}或用 rewrite + alias 配合(注意 alias 和 root 差异)
调试和避坑提示
匹配失败往往不是语法错,而是没搞清匹配阶段和作用域。
- rewrite 只对当前 location 内的请求生效;location 外写的 rewrite 无效
- URI 在 rewrite 前已被解码(如
%20→ 空格),pattern 应写解码后的形式 - 用
nginx -t检查语法,用error_log /path debug;查看 rewrite 执行日志(需编译时含 debug 日志支持) - 避免无限循环:比如
rewrite /a /a permanent;会 301 循环,加条件限制或用break控制流程


















