使用nginx反向代理tomcat,程序得到得协议头是http,ip是本地怎么处理

来自:互联网
时间:2020-03-31
阅读:

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

使用nginx反向代理tomcat,程序得到得协议头是http,ip是本地怎么处理

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

返回顶部
顶部