Nginx location 匹配规则

location 决定"某个 URI 交给哪个配置块处理",是 Nginx 最常用也最易混淆的语法。弄清几种写法与匹配顺序,反代、重写、静态资源路由才不会出错。

location 的几种写法

写法示例含义
精确匹配location = /loginURI 必须与 /login 完全相等
普通前缀location /img/以 /img/ 开头的 URI
^~ 前缀location ^~ /static/命中该前缀后不再检查正则
正则location ~ .(jpg|png)$区分大小写的正则匹配
正则(忽略大小写)location ~* .(jpg|png)$不区分大小写
命名location @fallback不参与 URL 匹配,仅供内部跳转

匹配顺序

location 匹配优先级 整体分两步,规则如下:

  1. 先在所有前缀型 location(精确 =、^~、普通前缀)里找出"最长匹配"的那个;
  2. 若最长匹配带 ^~(或 = 已命中),直接使用,不再查正则;
  3. 否则按配置文件书写顺序依次尝试正则,第一个命中的正则生效;
  4. 正则全部未命中,回退使用第 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 做回退即可覆盖绝大多数路由场景。

笔记加载中…