使用proxy_pass子目录转发请求至Node服务器时Nginx端口被覆盖问题
问题分析与解决方案
你的问题核心是Nginx反向代理HTTPS请求到HTTP的Node服务时,Node服务无法感知原始请求的HTTPS协议,导致响应内容中可能包含HTTP协议的链接,或客户端请求出现协议不匹配的错误。同时当前的proxy_redirect设置也可能导致重定向地址不正确。
需要在location /pat/块中补充以下配置:
- 添加
X-Forwarded-Proto头,告知Node服务原始请求使用的是HTTPS协议 - 调整
proxy_redirect配置,修正Node服务返回的重定向地址
修改后的location /pat/配置如下:
location /pat/ { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Proto $scheme; # 新增:传递原始请求协议 proxy_set_header Host $host; proxy_pass http://127.0.0.1:3000; # 替换原proxy_redirect off,修正重定向地址 proxy_redirect http://127.0.0.1:3000/ https://$host/pat/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; }
另外建议移除ssl on;指令,因为listen 443 ssl;已经开启了SSL功能,重复设置可能引发不必要的问题。
关键说明
X-Forwarded-Proto $scheme:$scheme会自动获取当前请求的协议(HTTPS),Node服务可通过这个头判断原始请求的协议,从而返回正确的HTTPS链接或响应proxy_redirect:当Node服务返回的重定向地址是http://127.0.0.1:3000/xxx时,Nginx会自动替换为https://local.tjrhodes.com/pat/xxx,确保客户端跳转地址为正确的HTTPS地址
修改完成后,重启Nginx服务生效:
sudo nginx -s reload
内容的提问来源于stack exchange,提问作者Tom Rhodes
相关产品推荐
相关产品推荐

