Tomcat不同版本配置RemoteIpFilter后getRequestURL返回协议不一致问题
问题根因
- Apache Tomcat 8.5.58、9.0.38版本对
RemoteIpFilter做了安全加固调整:只有请求来源IP属于internalProxies参数配置的内部代理范围时,Filter才会读取x-forwarded-proto等转发头更新请求属性,否则直接忽略所有转发头。 - Azure WebApps的前置反向代理节点的内网IP段不在Tomcat
internalProxies的默认允许列表内,因此升级到对应版本后,你配置的x-forwarded-proto头不会被Filter处理:Tomcat读取到的是Azure代理到实例的原始HTTP流量,因此getRequestURL()返回http协议。你打印的请求头中存在x-forwarded-proto也验证了该头已正常传递,只是被Filter拦截未生效。
修复方案
在你现有RemoteIpFilter配置中新增internalProxies初始化参数即可,因为Azure WebApps实例默认不会对外直接暴露,所有流量都会经过官方前置代理,可直接配置为匹配所有代理IP:
<filter> <filter-name>RemoteIpFilter</filter-name> <filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class> <init-param> <param-name>remoteIpHeader</param-name> <param-value>x-forwarded-for</param-value> </init-param> <init-param> <param-name>remoteIpProxiesHeader</param-name> <param-value>x-forwarded-by</param-value> </init-param> <init-param> <param-name>protocolHeader</param-name> <param-value>x-forwarded-proto</param-value> </init-param> <!-- 新增以下配置 --> <init-param> <param-name>internalProxies</param-name> <param-value>.*</param-value> </init-param> </filter>
配置更新后重新部署应用即可生效,getRequestURL()将正常返回https协议地址。
内容的提问来源于stack exchange,提问作者masapiko
相关产品推荐
相关产品推荐

