Nginx用最长前缀匹配实现基础路由分发,如location /api/和/location /static/分别转发API请求与静态资源;需注意斜杠一致性、避免前缀重叠,并可选^~强制前缀优先。

Nginx 中用通用前缀匹配(location 前缀匹配)实现基础路由分发,核心是利用 location /prefix { ... } 语法将不同 URL 路径前缀的请求转发到对应后端服务或静态资源目录,无需正则、不依赖精确匹配,简单高效。
理解前缀匹配的默认行为
Nginx 的 location 块在未加修饰符(如 ^~、~、=)时,默认采用“最长前缀匹配”:它会比较所有前缀 location 的字符串长度,选择与请求 URI 最长匹配的那个块,且区分大小写、不回溯。
-
location /api { ... }匹配/api、/api/、/api/users、/api/v1/status -
location /static { ... }匹配/static/logo.png、/static/css/app.css - 若同时存在
/api和/api/v1,请求/api/v1/users会命中更长的/api/v1
典型基础路由分发配置示例
以下配置将请求按前缀分发到不同目标:
server {
listen 80;
server_name example.com;
<pre class="brush:php;toolbar:false;"># 静态资源:/static/ → 本地文件系统
location /static/ {
alias /var/www/static/;
expires 1h;
}
# 后台 API:/api/ → 转发到上游服务
location /api/ {
proxy_pass http://127.0.0.1:8000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 管理后台:/admin/ → 另一后端或子应用
location /admin/ {
proxy_pass http://127.0.0.1:9000/;
}
# 默认入口:/ → 前端单页应用(SPA),支持 history 模式
location / {
root /var/www/frontend;
try_files $uri $uri/ /index.html;
}}
注意:proxy_pass 末尾的 / 很关键——它会剥离匹配前缀再拼接,例如 /api/users 经 proxy_pass http://.../; 后实际请求后端的 /users。
避坑要点与常见问题
-
末尾斜杠要一致:定义
location /api/时,请求必须带尾部/(如/api/)才能匹配;/api(无斜杠)会走其他 location 或 404 -
避免重叠导致误匹配:比如
/user和/users共存时,/users/info会匹配/users(更长),而非/user - 不建议混用前缀与正则在同一层级:Nginx 会先找最长前缀,再看是否有更优正则;但逻辑易混乱,基础分发优先用纯前缀
-
调试技巧:启用
error_log /path/to/error.log notice;,并观察 access log 中的$request_uri和实际匹配的 location
进阶:用 ^~ 强制前缀优先(可选)
如果某前缀 location 必须严格优于任何正则匹配(即使有更长正则),可在前面加 ^~:
location ^~ /assets/ {
alias /var/www/assets/;
}
此时即使存在 location ~ \.js$ { ... },对 /assets/main.js 也会优先走 ^~ 分支,提升确定性。











