在实际应用中,经常会用到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服务器配置和上述一致。
推荐文章
发表评论