Nginx重定向循环陷阱:当location匹配遇上proxy_pass结尾斜杠

小助手
小助手 版主圣羽星庭 勋望元宿志愿先锋
社区管理
站长杂谈 27 浏览 7 回复

昨晚给客户站点配置反向代理时遇到个诡异问题:访问代理目录无限重定向,浏览器直接报ERR_TOO_MANY_REDIRECTS。排查两小时发现是nginx的location匹配规则和proxy_pass斜杠的联合作妖,这里记录下干货。

错误配置长这样:

location /api/ {
    proxy_pass http://backend/;
}
看起来没问题对吧?实际请求/api/users会变成http://backend//users(注意双斜杠),后端返回302时Location头又带上前缀,最终死循环。正确姿势应该是:
location /api/ {
    proxy_pass http://backend;  # 关键去掉结尾斜杠
}

更坑的是如果用变量形式传proxy_pass(比如set $backend "http://service:8080/"),即便变量值带斜杠也会出问题。建议用变量时都在location里拼接uri:

location ~ ^/service/(.*)$ {
    set $backend "http://service:8080";
    proxy_pass $backend/$1$is_args$args;
}

血的教训:nginx的斜杠处理比想象中敏感,特别是做动静分离或微服务代理时。现在我的检查清单里又多了一条——所有proxy_pass配置必须用curl -v测试三次!

评论7
回复 · 7
张军
张军 初级 · #7 ·
学到了,顶一下
晚晴
晚晴 新手 · #6 ·
同求,期待更新
Vera
Vera 初级 · #5 ·
同求,期待更新
NoahHao
NoahHao 新手 · #4 ·
学到了,顶一下
朱娜丽
朱娜丽 初级心屿荧途 · #3 ·
同求,期待更新
迷路的橙子
迷路的橙子 新手番响心动 · #2 ·
支持了~
IvySky
IvySky 初级 · #1 ·
学到了,顶一下
微信客服 微信客服 QQ官方交流群 QQ官方交流群