使用Tomcat直接配置https繁琐又复杂,而且不能热加载证书,通常网站配置https都是在tomcat前面加一个反向代理程序比如apache、nginx之类得

135913_nax9_12.png

比如下面这段配置 就是用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就能从请求头中拿真正的协议头了

2条评论
发表评论