Spring Boot访问localhost与主机IP时重定向协议不一致问题排查
问题原因分析及解决办法
核心原因是Spring Boot 1.5.x依赖的Tomcat RemoteIpValve 的 internalProxies 配置差异导致的:
- 当你设置
server.use-forward-headers=true时,Tomcat会启用RemoteIpValve,这个阀只会信任**可信代理列表(internalProxies)**中的请求携带的X-Forwarded-*头。 - Tomcat默认的
internalProxies包含127.0.0.0/8、10.0.0.0/8、192.168.0.0/16、172.16.0.0/12(注意这个网段只覆盖到172.31.x.x,不包含172.32.x.x)。 - 在主机2上执行
curl localhost:8080时,请求来源IP是127.0.0.1,属于默认可信列表,所以Tomcat会读取X-Forwarded-Proto: https,生成https://example.com/login的重定向地址。 - 而执行
curl 172.32.1.1:8080时,请求来源IP是172.32.1.1,不在默认的internalProxies范围内,Tomcat会忽略X-Forwarded-Proto头,直接用当前请求的http协议生成重定向地址。
主机1正常的原因大概率是:主机1的配置中已经把172.32.0.0/16网段加入了Tomcat的可信代理列表,可能是通过Spring Boot配置项server.tomcat.remote-ip-valve.internal-proxies设置的,或者自定义了Tomcat的Valve配置。
验证与解决步骤
验证
对比主机1和主机2的application.properties(或yml)配置,检查是否存在server.tomcat.remote-ip-valve.internal-proxies项的差异。
解决
在主机2的application.properties中添加以下配置,将172.32.x.x网段加入可信代理列表:
# 覆盖默认internalProxies,加入172.32.x.x网段 server.tomcat.remote-ip-valve.internal-proxies=127\\.0\\.0\\.1/8,10\\.0\\.0\\.0/8,192\\.168\\.0\\.0/16,172\\.16\\.0\\.0/12,172\\.32\\.0\\.0/16
或者使用正则匹配写法:
server.tomcat.remote-ip-valve.internal-proxies=10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|192\\.168\\.\\d{1,3}\\.\\d{1,3}|169\\.254\\.\\d{1,3}\\.\\d{1,3}|127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|172\\.1[6-9]{1}\\.\\d{1,3}\\.\\d{1,3}|172\\.2[0-9]{1}\\.\\d{1,3}\\.\\d{1,3}|172\\.3[0-1]{1}\\.\\d{1,3}\\.\\d{1,3}|172\\.32\\.\\d{1,3}\\.\\d{1,3}
配置完成后重启应用,再用curl 172.32.1.1:8080测试,重定向地址就会正确使用HTTPS协议了。
内容的提问来源于stack exchange,提问作者user997943
相关产品推荐
相关产品推荐

