Nginx 增加SSL认证之后,request.getScheme()获取不到https的问题记录

Nginx+Tomcat 部署 request.getScheme获取不到Https问题

通过浏览器输入https://www.xxx.com,request.getScheme()获取到的确实http而不是https.
通过request.getRequestURL()拿到的也是http://www.xxx.com
分析原因,是因为用nginx+tomcat部署web服务,tomcat接受到的请求都是来自于nginx的http请求

1
2
3
4
5
request.getScheme()  //总是 http,而不是实际的http或https  
request.isSecure() //总是false(因为总是http)
request.getRemoteAddr() //总是 nginx 请求的 IP,而不是用户的IP
request.getRequestURL() //总是 nginx 请求的URL 而不是用户实际请求的 URL
response.sendRedirect( 相对url ) //总是重定向到 http 上 (因为认为当前是 http 请求)

解决办法:

  1、在nginx 配置location处加上proxy_set_header X-Forwarded-Scheme $scheme;
    通过request.getHeader(“X-Forwarded-Scheme”)获取真实的scheme
  2、在Tomcat server.xml中添加

1
2
3
4
5
6
<Engine name="Catalina" defaultHost="localhost">  
  这行之后
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="X-Forwarded-For"
protocolHeader="X-Forwarded-Proto"
protocolHeaderHttpsValue="https"/>

分享到