Nginx proxy_pass斜杠路径转发区别
Nginx 反向代理里 proxy_pass 末尾到底带不带斜杠,是最容易写错、也最容易导致后端 404 的地方。同样一个 location,proxy_pass 有没有结尾斜杠,转发给后端的 URL 路径完全不同。很多人配置后后端报 404、路径多一截或少一截,问题就出在这个斜杠上。本文把规则讲清并给对比例子。
一、核心规则
proxy_pass 的目标地址分两种写法:
- 带协议和主机,末尾可带路径或斜杠:
http://127.0.0.1:8080/ - 不带路径(纯主机):
http://127.0.0.1:8080
关键判断:当 proxy_pass 后带了 URI(哪怕只是一个 /),Nginx 会把 location 匹配到的那一段替换掉;不带 URI 时,则把完整原始路径原样拼到后端。
二、带斜杠:替换匹配段
location /api/ {
proxy_pass http://127.0.0.1:8080/;
}
访问 /api/user/list,匹配 /api/,这一段被替换成 /,后端收到的是:
http://127.0.0.1:8080/user/list
/api/ 前缀被剥掉了。
三、不带斜杠:原样转发
location /api/ {
proxy_pass http://127.0.0.1:8080;
}
访问 /api/user/list,后端收到完整路径:
http://127.0.0.1:8080/api/user/list
/api/ 保留,原样透传。
四、带自定义路径的情况
location /api/ {
proxy_pass http://127.0.0.1:8080/backend/;
}
访问 /api/user,匹配段 /api/ 被替换成 /backend/,后端收到:
http://127.0.0.1:8080/backend/user
五、完整反向代理示例
location /app/ {
proxy_pass http://127.0.0.1:9000/;
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;
}
改完执行 nginx -t 校验,再 nginx -s reload 重载。
常见坑
- 后端本身就需要
/api/前缀,你却加斜杠剥掉,结果全 404。 - proxy_pass 写了主机又写端口,末尾漏斜杠导致路径重复。
- location 用正则
~时不能在 proxy_pass 里写固定路径,需用变量拼接。 - 只改配置没
nginx -t校验,重载失败导致整站 502。 - 后端框架按转发路径找路由,前缀不一致就报路由不存在。
- 误以为斜杠只是美观符号,实际它决定路径替换规则。
总结
记住一句话:proxy_pass 后带 URI(含 /)就替换 location 匹配段,不带就原样透传完整路径。先确认后端路由要不带 /api/,再决定斜杠去留,改完务必 nginx -t 再重载。
遇到问题加QQ23979811 协助处理