Nginx反向代理重定向时路径前缀缺失问题求助
Nginx反向代理重定向路径前缀缺失问题解决
当前配置下,访问myservername.com/mywebsite可正常转发至http://mybackendwebsite.com:1234/,但后端返回重定向时,路径前缀mywebsite未被追加,导致跳转至错误的myservername.com/myredirectedpath,期望目标为myservername.com/mywebsite/myredirectedpath,添加proxy_redirect http://mybackendwebsite.com/ /mywebsite;后问题未解决,可通过以下方式调整:
方法一:完善proxy_redirect规则匹配覆盖所有情况
后端返回的重定向可能存在两种形式:带自身域名的绝对URL,或仅路径的相对URL。原规则只匹配了带后端域名的情况,需补充匹配相对路径的规则:
location ^~ /mywebsite { rewrite ^/mywebsite(/.*)$ $1 break; proxy_pass http://mybackendwebsite.com:1234/; 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_redirect http://mybackendwebsite.com/ /mywebsite/; proxy_redirect / /mywebsite/; }
方法二:通过请求头让后端自行生成带前缀的重定向
如果后端支持X-Forwarded-Prefix请求头,可以在代理时添加该头,告知后端当前的路径前缀,让后端直接生成包含/mywebsite的重定向URL:
location ^~ /mywebsite { rewrite ^/mywebsite(/.*)$ $1 break; proxy_pass http://mybackendwebsite.com:1234/; 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-Prefix /mywebsite; }
方法三:调整proxy_pass写法,让Nginx自动处理路径映射
如果可以接受后端接收带/mywebsite前缀的请求(即去掉原rewrite规则),可直接调整proxy_pass的格式,让Nginx自动处理重定向的路径替换:
location ^~ /mywebsite { proxy_pass http://mybackendwebsite.com:1234; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 使用默认重定向规则,Nginx会自动替换路径前缀 proxy_redirect default; }
注:此方法下,访问
myservername.com/mywebsite/path会转发至http://mybackendwebsite.com:1234/mywebsite/path,若后端不需要该前缀,建议使用前两种方法。
内容的提问来源于stack exchange,提问作者Marvinatorrr
相关产品推荐
相关产品推荐

