踩坑四:Zuul 重定向问题
原创2019/4/2大约 1 分钟
踩坑四:Zuul 重定向问题
1、业务背景
- 项目使用
Spring Cloud架构 - 在请求前使用
Zuul做路由网关(192.168.1.10:8769) - 后有两个实例节点提供服务(192.168.1.11:8866,192.168.1.12:8866)
- 他们都注册到了
Eureka服务中心(192.168.1.13:8761)
2、问题现象
有一个普遍的场景,用户未登录的情况下直接访问个人中心页面,则后端拦截器直接重定向到登录页面!
(1)理想的情况应该是这样的:
访问 192.168.1.10:8769/user/center.html,未登录,跳转至:192.168.1.10:8769/login.html
(2)现实的情况竟然是这样的:
访问 192.168.1.10:8769/user/center.html,未登录,跳转至:192.168.1.11(或 12):8866/login.html
沃特法克???暴露出了服务的具体地址和端口,跳转的不对!
3、定位原因
Spring Cloud Zuul 没有正确的处理 HTTP 请求头信息中的 Host 导致。在 Brixton 版本中,Spring Cloud Zuul 的 PreDecorationFilter 过滤器实现时完全没有考虑这一问题,它更多的定位于 REST API 的网关。所以如果要在 Brixton 版本中增加这一特性就相对较为复杂,不过好在 Camden 版本之后,Spring Cloud Netflix 1.2.x 版本的 Zuul 增强了该功能,我们只需要通过配置属性 zuul.add-host-header=true 就能让原本有问题的重定向操作得到正确的处理。
4、解决方案
在 Zuul 的配置文件(application.yml 等)配置:
### 网关配置
zuul:
# ...
# 此处解决后端服务重定向导致用户浏览的 host 变成 后端服务的 host 问题
add-host-header: true
