在实际应用中,经常会用到THS反向代理应用,其中就会出现一种情况,访问https页面Java 通过request.getScheme()获取不到https协议,或者response.sendRedirect重定向是http,而不是我们想要的https。

问题原因:

        经过反向代理后,协议信息没有转发到后端,或者后端没有设置protocolHeader。

单个THS下的配置:

1、需要在THS配置文件中的location里加上如下配置

location /test {

    proxy_set_header Host $http_host;

    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_pass http://cluster;

}

2、TongWeb服务器配置

企业版

登录控制台==》WEB容器配置==》虚拟主机管理==》自定义Value加如下内容

com.tongweb.catalina.valves.RemoteIpValve,protocolHeader=X-Forwarded-Proto,remoteIpHeader=X-Forwarded-For,protocolHeaderHttpsValue=https

嵌入版

application.properties配置文件中加入如下配置

#提取protocol的header名

server.tongweb.protocol-header=X-Forwarded-Proto

#提取remote ip的header名

server.tongweb.remote-ip-header=X-Forwarded-For

#设置用来表明是SSL请求的header名

server.tongweb.protocol-header-https-value=https

多级THS下的配置:

        通常的架构是内部的THS之间采用的是http进行通讯,一级代理配置https,二级及以上的THS则是配置http。架构图如下:

一级THS配置:

配置https最重要的两个参数为:

proxy_redirect http:// $scheme://;

proxy_set_header X-Forwarded-Proto $scheme;

        第一个参数的作用是将请求重定向为指定的协议(http,https),其中$scheme是请求的THS的协议,即server配置的是什么协议,则$scheme就是什么协议。由于一级THS设置的是https协议,所以$scheme为https。这一级设置的协议就是我们浏览器中访问网站所采用的协议。

        第二个参数的作用则是将请求结果中内容中的地址(css,js,图片等静态资源地址)重定向为访问的协议的地址。例如:访问的域名为https://www.test.com  则返回结果将静态文件地址替换成https://www.test.com。默认是http协议,如果不进行设置,会发现代理的网站的所有静态文件,图片、css、js等url都是采用默认的http协议,导致https代理失败。

二级及以上的THS配置:

        在THS中设置X-Forwarded-Proto采用的协议,这个参数的值将会传递到下级的THS中。通过$http_x_forwarded_proto参数来进行获取,则此时可以重新设置一个参数$newscheme(这个自定义只要不是$scheme即可)。设置如下:

location /test {

    set $newscheme http;

    if ($http_x_forwarded_proto = "https") {

        set $newscheme https;

    }

    proxy_set_header Host $http_host;

    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 $newscheme;

    proxy_pass http://cluster;

}

        通过X-Forwarded-Proto的传递性(在每一层的反向代理都需要这样配置),将第一级代理的协议一层一层的传递到最底层的反向代理中。TongWeb服务器配置和上述一致。

推荐文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: