Nginx+Docker反向代理路径问题求助:/myapp跳转后返回404
解决方案
方法1:用proxy_redirect修正跳转URL
后端返回的Location: /login这类跳转没有带上/myapp前缀,直接用Nginx改写响应头里的跳转地址就行。修改你的location配置:
location /myapp { proxy_pass http://192.168.1.150:8080; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $http_host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 把后端返回的根路径跳转替换成带/myapp前缀的路径 proxy_redirect http://192.168.1.150:8080/ https://$http_host/myapp/; proxy_redirect / /myapp/; }
方法2:调整proxy_pass路径,让后端接收带前缀的请求
如果你的myapp支持接收/myapp开头的请求,直接把proxy_pass的目标路径加上/myapp,同时给后端传递前缀信息:
location /myapp { proxy_pass http://192.168.1.150:8080/myapp; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $http_host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 告诉后端它的访问前缀是/myapp proxy_set_header X-Forwarded-Prefix /myapp; }
这种情况下后端收到的请求都是/myapp/xxx格式,返回的跳转也会自动带上/myapp前缀。
方法3:用rewrite重写请求路径
如果前两种方法不生效,试试先把请求路径里的/myapp去掉再传给后端,同时修正跳转:
location /myapp { rewrite ^/myapp/(.*)$ /$1 break; proxy_pass http://192.168.1.150:8080; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $http_host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect / /myapp/; }
验证步骤
修改配置后,执行命令重载Nginx配置(Docker环境用docker exec <nginx容器名> nginx -s reload),再访问https://192.168.1.150/myapp,检查跳转后的URL是否为https://192.168.1.150/myapp/login,且能正常访问页面。
内容的提问来源于stack exchange,提问作者koger23
相关产品推荐
相关产品推荐

