Nginx子路径反向代理关键在于proxy_pass末尾斜杠控制路径重写:不带斜杠则完整转发URI,带斜杠则剥离location前缀;正确配置需location与proxy_pass均以斜杠结尾,并用proxy_redirect修正后端重定向路径。

在 Nginx 中用 proxy_pass 配置子路径反向代理,关键在于路径重写与后端服务 URL 的匹配逻辑。配置不当容易导致 404、资源加载失败或重定向异常。
理解 proxy_pass 后的路径写法差异
Nginx 对 proxy_pass 指令末尾是否带路径(特别是结尾斜杠)有严格语义区分:
-
不带结尾斜杠:如
proxy_pass http://backend;,Nginx 会把原始请求的完整 URI(含 location 匹配部分)原样转发给后端。例如location /api/+ 请求/api/users→ 后端收到/api/users -
带结尾斜杠:如
proxy_pass http://backend/;(注意末尾斜杠),Nginx 会剥离 location 匹配前缀,只转发剩余路径。例如location /api/+ 请求/api/users→ 后端收到/users
正确配置子路径代理的典型写法
假设你想把 https://example.com/app1/xxx 代理到后端 http://127.0.0.1:8080/xxx(即去掉 /app1 前缀):
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
location /app1/ {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
注意:/app1/ 和 http://127.0.0.1:8080/ 都以斜杠结尾,才能确保路径被正确截断和拼接。
避免常见陷阱
-
location 末尾斜杠必须与 proxy_pass 语义对齐:若写成
location /app1(无尾斜杠),则/app1和/app1/会被视为不同路径;建议统一用/app1/形式并加尾斜杠 -
后端服务本身监听根路径时,务必用
proxy_pass .../,否则请求会多带一层前缀,比如后端不支持/app1/users,只认/users -
静态资源或重定向响应可能含绝对路径:后端返回
Location: /login会导致跳转到https://example.com/login而非/app1/login。此时需用proxy_redirect修正:proxy_redirect / /app1/;(将后端返回的根路径重定向改写为子路径)
进阶:多个子路径代理共存
可并列定义多个 location,互不干扰:
location /admin/ {
proxy_pass http://127.0.0.1:9000/;
proxy_redirect / /admin/;
}
location /api/ {
proxy_pass http://127.0.0.1:3000/;
proxy_redirect / /api/;
}
每个子路径独立处理路径截断与重定向重写,适合前后端分离或多服务聚合场景。

















