Nginx location 匹配规则
location 决定"某个 URI 交给哪个配置块处理",是 Nginx 最常用也最易混淆的语法。弄清几种写法与匹配顺序,反代、重写、静态资源路由才不会出错。
location 的几种写法
| 写法 | 示例 | 含义 |
|---|---|---|
| 精确匹配 | location = /login | URI 必须与 /login 完全相等 |
| 普通前缀 | location /img/ | 以 /img/ 开头的 URI |
| ^~ 前缀 | location ^~ /static/ | 命中该前缀后不再检查正则 |
| 正则 | location ~ .(jpg|png)$ | 区分大小写的正则匹配 |
| 正则(忽略大小写) | location ~* .(jpg|png)$ | 不区分大小写 |
| 命名 | location @fallback | 不参与 URL 匹配,仅供内部跳转 |
匹配顺序
整体分两步,规则如下:
- 先在所有前缀型 location(精确 =、^~、普通前缀)里找出"最长匹配"的那个;
- 若最长匹配带 ^~(或 = 已命中),直接使用,不再查正则;
- 否则按配置文件书写顺序依次尝试正则,第一个命中的正则生效;
- 正则全部未命中,回退使用第 1 步找出的最长普通前缀。
location = /favicon.ico { log_not_found off; } # 精确命中即结束
location / { root /var/www/html; } # 兜底普通前缀
location ^~ /static/ { alias /data/static/; } # 命中后跳过正则
location ~* \.(css|js|png)$ { expires 7d; } # 正则
上例访问 /static/app.js:最长前缀是 ^~ /static/,直接生效,正则不再参与。
正则与普通前缀的先后
访问 /a.png 时:精确与 ^~ 均未命中,最长普通前缀是 location /;随后按顺序检查正则,* .(css|js|png)$ 命中,最终生效的是该正则块的 expires。结论:书写在后的正则压得过 location /,但压不过 ^ 前缀。
内部跳转后的二次匹配
rewrite、try_files 把 URI 改写后,Nginx 会用新 URI 重新走一遍 location 匹配(rewrite 带 last 标志或内部重定向时):
location /old/ {
rewrite ^/old/(.*)$ /new/$1 last; # 改写为 /new/xxx 后重新匹配
}
location /new/ {
alias /data/new/;
}
注意 rewrite 带 break 标志时不会重新匹配,见第 08 章。
@ 命名 location
命名 location 只能被 error_page、try_files、rewrite 等指令内部引用,常用于统一兜底页:
location / {
try_files $uri $uri/ @fallback; # 找不到静态文件时转交 @fallback
}
location @fallback {
proxy_pass http://127.0.0.1:3000; # 由前端应用兜底渲染
}
小结:location 优先级记住一条主线——精确 = 命中即停,其次 ^~ 前缀(跳过正则),再次正则(按书写顺序),普通前缀取最长兜底;配合 @ 命名 location 做回退即可覆盖绝大多数路由场景。