问题:
Java Web 应用中 request.getRequestURL()
返回的 URL 协议是 http
,但实际客户端是通过 https
访问的。
原因:
请求路径是:Client → HTTPS → Nginx (SSL Termination) → HTTP → java后端
- Nginx 负责处理 HTTPS 解密(SSL 终止)。
- 然后 Nginx 通过 HTTP 协议转发请求到后端 Java 应用(如 Tomcat)。
- 后端 Java 应用看到的是 HTTP 请求,所以
request.getRequestURL()
返回http://xxx
- 但它不知道前端是通过 HTTPS 访问的。
解决方法:
1.Nginx 配置添加标准 Header
bash
location /project/ {
proxy_set_header Host $host:58090;
proxy_set_header X-Real-IP $remote_addr;
# 解决request.getRequestURL()请求地址不正确问题
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
# 将客户端的来源页面信息传递给后端应用
proxy_set_header Referer $http_referer;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.244.166:8086/project/;
}
2.springboot项目添加以下配置
java
# application.yml Spring Boot 2.1 及更早版本
server:
use-forward-headers: true
# Spring Boot 2.2+
server:
forward-headers-strategy: native # 依赖容器(如 Tomcat)的原生支持