Skip to content

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.org

SetRequestHostHeader GatewayFilter 工厂将 Host Header 的值替换为 example.org

补充教学 —— 为什么要修改 Host Header?

Host Header 的作用:在 HTTP 协议中,Host 头部告诉服务器你想访问哪个主机(域名)。这对于虚拟主机(Virtual Host)非常重要,因为一台服务器上可能托管了多个网站(www.a.com, www.b.com)。

使用场景

  1. 内部域名欺骗/测试

    • 后端的微服务可能配置了只响应 internal.service.local 这个域名的请求。
    • 但为了测试方便,你从外部发请求给网关 my-gateway.com/test
    • 网关转发时,如果直接用 my-gateway.com,后端服务会拒绝。
    • 这时就需要 SetRequestHostHeader=internal.service.local 来“假装”是内部调用。
  2. 对接第三方服务

    • 有些第三方 API(如云存储 S3)强制校验 Host Header,必须与 Bucket 域名一致。
    • 如果通过网关做反向代理,就需要强制修改 Host 为第三方要求的域名。

区别

  • PreserveHostHeader保留客户端原始的 Host(不让网关自动改为下游服务的 IP/域名)。
  • SetRequestHostHeader强制修改为指定的一特定值。

Based on Spring Framework.