Tomcat http转https

在使用阿里云的SLB时发现将https映身上http时,当使用response.sendRedirect进行转身时会跳成http请求。这是因为tomcat把请求来源当成了http.

使用以下方法来解决这个问题:

1. 在SLB的基本配置的高级配置中开启SLB监听协议。

2. 修改tomcat配置文件
2.1  设定TOMCAT的使用前端代理模式,解决TOMCAT中程序的redirect没有跳转到SSL的问题。
<Connector port="8080"
  proxyName="这里是域名"
  proxyPort="443"
  scheme="https"
  secure="true"

  protocol="org.apache.coyote.http11.Http11NioProtocol"
  connectionTimeout="20000" URIEncoding="UTF-8" useBodyEncodingForURI="true"
  redirectPort="8443" />
上述的含义是,
SLB的域名是proxyName
SLB对外端口是proxyPort
SLB使用的协议是https
SLB是否开启SSL:secure

2.2 设定X-Forwarded过滤器
在server.xml中的<Engine>元素下增加如下内容:
<Valve className="org.apache.catalina.valves.RemoteIpValve"
    internalProxies="47\.74\.\d{1,3}\.\d{1,3}"
    remoteIpHeader="X-Forwarded-For"
    protocolHeader="X-Forwarded-Proto"
    protocolHeaderHttpsValue="https"/>

internalProxies的意思是:TOMCAT仅接受这个IP段过来的请求中的X-Forwarded系列的值覆写为Remote_Addr等。加了这个过滤器之后使用request.getRemoteAddr()就可以获取到正确的客户端IP了。需要注意的是,这个IP段需要根据你所用的SLB来写。

在TOMCAT里,internalProxies的默认值为(无法覆盖到SLB的IP段):
10\.\d{1,3}\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}|169\.254\.\d{1,3}\.\d{1,3}|127\.\d{1,3}\.\d{1,3}\.\d{1,3}|172\.1[6-9]{1}\.\d{1,3}\.\d{1,3}|172\.2[0-9]{1}\.\d{1,3}\.\d{1,3}|172\.3[0-1]{1}\.\d{1,3}\.\d{1,3} 
特别注意:
这个<Value>一定要写在<Engine>元素下!
这个<Value>一定要写在<Engine>元素下!
这个<Value>一定要写在<Engine>元素下!
不要跟在<Host>里面

猜你喜欢

转载自wen19851025.iteye.com/blog/2390920