解决访问 https 网站时,后端重定向或获取 URL 变成 http 的问题
在常见的Nginx反向代理后端Java应用的部署架构中,客户端与Nginx之间为HTTPS,但Nginx转发至后端服务器的请求协议为HTTP。这会导致后端应用通过`HttpServletRequest.getRequestURL()`获取到的URL为内网HTTP地址,且`HttpServletResponse.sendRedirect()`生成的重定向地址也为HTTP,无法反映真实的客户端访问协议。 解决此问题需结合Nginx配置与后端代码调整。对于URL获取问题,需在Nginx中通过`proxy_set_header Host $host`和`proxy_set_header X-Forwarded-Proto $scheme`向后端传递原始主机名与协议信息。后端Java应用则需通过自定义Servlet过滤器,读取`X-Forwarded-Proto`头并重写请求的`getScheme()`与`getRequestURL()`方法,确保返回正确的HTTPS URL。对于重定向问题,可通过Nginx的`proxy_redirect http:// $scheme://`指令,将后端响应中的Location头协议自动修正。 当架构中Nginx前存在负载均衡器时,需由负载均衡器透传`X-Forwarded-Proto`头,同时将Nginx配置中相关的`$scheme`变量替换为`$http_x_forwarded_proto`,以正确识别和传递最前端的访问协议。