nginx 通过同一 server 块内多个 location 指令按路径前缀匹配并 proxy_pass 转发,实现同域名下不同目录精准分发;proxy_pass 结尾斜杠影响路径重写,多域名则用多个 server 块分别配置。

Nginx 通过 server 块 + location 指令组合,就能把同一域名下的不同路径(即不同目录)精准分发到不同后端服务。关键不在 server 块本身做目录映射,而是在一个 server 块里用多个 location 匹配路径前缀,再各自用 proxy_pass 转发。
同一 server 下按路径区分后端
一个 server 块监听某个端口和域名,内部用多个 location 规则识别请求路径,每个规则独立配置转发目标:
-
location /api/→ 转发到http://127.0.0.1:3000/ -
location /admin/→ 转发到http://127.0.0.1:8001/ -
location /(根路径)→ 静态文件或主前端服务
示例配置:
server {
listen 80;
server_name example.com;
# 静态资源或主站首页
location / {
root /var/www/frontend;
try_files $uri $uri/ /index.html;
}
# API 接口统一走 /api/ 前缀
location /api/ {
proxy_pass http://127.0.0.1:3000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 后台管理系统单独部署
location /admin/ {
proxy_pass http://127.0.0.1:8001/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
注意 proxy_pass 结尾的 /:
- 写成
http://127.0.0.1:3000/,表示/api/user→ 转发为/user - 写成
http://127.0.0.1:3000(无尾斜杠),会原样带上/api/user,后端容易 404
多个 server 块对应不同域名 + 各自根目录
如果不同“目录”实际是不同域名(如 a.example.com 和 b.example.com),那就用多个 server 块,每个块用 server_name 匹配域名,并设置独立 root 或 proxy_pass:
-
server_name a.example.com→root /var/www/a/或proxy_pass http://backend-a -
server_name b.example.com→root /var/www/b/或proxy_pass http://backend-b
这种结构更清晰,适合完全隔离的站点。
路径重写与子路径兼容处理
某些后端不接受带前缀的路径(比如 /api/xxx 转过去变成 /xxx 才能识别),可用 rewrite 配合 proxy_pass:
location /v1/ {
rewrite ^/v1/(.*)$ /$1 break;
proxy_pass http://127.0.0.1:9000;
}
也可用 proxy_redirect 调整响应头中的跳转地址,避免后端返回的 Location 头暴露内网路径。
注意事项
-
location匹配遵循最长前缀优先原则,/api/v2/会优先进入location /api/v2/而不是/api/ - 若需精确匹配某路径(如只匹配
/health),用location = /health - 静态文件建议用
root+try_files,动态接口一律用proxy_pass - 所有
proxy_pass后端地址必须带协议(http://或https://),不能只写localhost:3000
不复杂但容易忽略











