SetRequestHostHeader GatewayFilter 工厂
在某些情况下,可能需要覆盖 Host Header。在这种情况下,SetRequestHostHeader GatewayFilter 工厂可以将现有的 Host Header 替换为指定的值。 该过滤器接受一个 host 参数。
以下示例配置了一个 SetRequestHostHeader GatewayFilter:
application.yml
yaml
spring:
cloud:
gateway:
routes:
- id: set_request_host_header_route
uri: http://localhost:8080/headers
predicates:
- Path=/headers
filters:
- name: SetRequestHostHeader
args:
host: example.orgSetRequestHostHeader GatewayFilter 工厂将 Host Header 的值替换为 example.org。
补充教学 —— 为什么要修改 Host Header?
Host Header 的作用:在 HTTP 协议中,Host 头部告诉服务器你想访问哪个主机(域名)。这对于虚拟主机(Virtual Host)非常重要,因为一台服务器上可能托管了多个网站(www.a.com, www.b.com)。
使用场景:
内部域名欺骗/测试:
- 后端的微服务可能配置了只响应
internal.service.local这个域名的请求。 - 但为了测试方便,你从外部发请求给网关
my-gateway.com/test。 - 网关转发时,如果直接用
my-gateway.com,后端服务会拒绝。 - 这时就需要
SetRequestHostHeader=internal.service.local来“假装”是内部调用。
- 后端的微服务可能配置了只响应
对接第三方服务:
- 有些第三方 API(如云存储 S3)强制校验 Host Header,必须与 Bucket 域名一致。
- 如果通过网关做反向代理,就需要强制修改 Host 为第三方要求的域名。
区别:
PreserveHostHeader:保留客户端原始的 Host(不让网关自动改为下游服务的 IP/域名)。SetRequestHostHeader:强制修改为指定的一特定值。