使用Tomcat直接配置https繁琐又复杂,而且不能热加载证书,通常网站配置https都是在tomcat前面加一个反向代理程序比如apache、Nginx之类得
比如下面这段配置 就是用nginx将本地的8080端口tomcat应用反向代理到了443端口
upstream cms { #这里填写CMS的真实地址和端口,可使用多行以下配置启用集群 ip_hash; server localhost:8080 weight=1; }
server { listen 443 ssl; server_name www.publiccms.com; ssl_certificate fullchAIn.pem; ssl_certificate_key privkey.pem; ssl_trusted_certificate chain.pem; location / { proxy_redirect off; proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_connect_timeout 5; proxy_send_timeout 30; proxy_read_timeout 10; proxy_pass http://cms; } }
上面的配置中proxy_set_header配置项是将真正的请求协议头,客户ip等信息放在了发给tomcat的请求头中
nginx和tomcat直接是通过http协议通信的,tomcat直接用request.getScheme()方法取协议头拿到的是http
通常大部分程序中取ip的时候 都附带了有限取头信息中X-Real-IP的逻辑,但是协议头一般还是使用的request.getScheme();
需要给tomcat conf/server.xml的Host标签中增加一行配置
<Valve className="org.apache.catalina.valves.RemoteIpValve" protocolHeader="X-Forwarded-Proto"/>
然后重启tomcat,tomcat就能从请求头中拿真正的协议头了