8. HttpHeader Filters
在请求分发到下游前,会经过HttpHeadersFilters 处理,比如NettyRoutingFilter。
8.1 Forwarded Headers Filter
先介绍一下Forwarded header:
Forwarded 首部中包含了代理服务器的客户端的信息,即由于代理服务器在请求路径中的介入而被修改或丢失的信息。
语法
Forwarded: by=; for=; host=; proto=<http|https>
-
< identifier >
一个 identifier 显示了在使用代理的过程中被修改或者丢失的信息。它们可以是以下几种形式:
一个IP地址(V4 或 V6,端口号可选,ipv6 地址需要包含在方括号里面,同时用引号括起来),
语意不明的标识符(比如 “_hidden” 或者 “_secret”),
或者是 “unknown”,当当前信息实体不可知的时候(但是你依然想要说明请求被进行了转发)。 -
by= < identifier >
该请求进入到代理服务器的接口。 -
for=< identifier >
发起请求的客户端以及代理链中的一系列的代理服务器。 -
host=< host >
代理接收到的 Host 首部的信息。 -
proto=<http|https>
表示发起请求时采用的何种协议(通常是 “http” 或者 “https”)。
示例
Forwarded: for="_mdn"
# 大小写不敏感
Forwarded: For="[2001:db8:cafe::17]:4711"
# for proto by 之间可用分号分隔
Forwarded: for=192.0.2.60; proto=http; by=203.0.113.43
# 多值可用逗号分隔
Forwarded: for=192.0.2.43, for=198.51.100.17
Forwarded Headers Filter 会在请求发往下游前,创建一个Forwarded header。如果已经存在Forwarded header,则把当前请求的host,port,scheme添加到Forwarded header中
8.2 RemoveHopByHop Headers Filter
RemoveHopByHop Headers Filter 默认删除转发的请求中以下header:
- Connection
- Keep-Alive
- Proxy-Authenticate
- Proxy-Authorization
- TE
- Trailer
- Transfer-Encoding
- Upgrade
可以通过修改属性spring.cloud.gateway.filter.remove-non-proxy-headers.headers 指定要删除的header
8.3 XForwarded Headers Filter
先介绍一下X-Forwarded-*:
X-Forwarded-For (XFF) 在客户端访问服务器的过程中如果需要经过HTTP代理或者负载均衡服务器,可以被用来获取最初发起请求的客户端的IP地址,这个消息首部成为事实上的标准。在消息流从客户端流向服务器的过程中被拦截的情况下,服务器端的访问日志只能记录代理服务器或者负载均衡服务器的IP地址。如果想要获得最初发起请求的客户端的IP地址的话,那么 X-Forwarded-For 就派上了用场。
HTTP 协议中的 Forwarded 是这个消息首部的标准化版本。
X-Forwarded-For 也是一个电子邮件相关协议中用到的首部,用来表示一封电子邮件是从其他账户转发过来的。
语法
X-Forwarded-For: < client >, < proxy1 >, < proxy2 >
指令
- < client >
客户端的IP地址。 - < proxy1 >, < proxy2 >
如果一个请求经过了多个代理服务器,那么每一个代理服务器的IP地址都会被依次记录在内。也就是说,最右端的IP地址表示最近通过的代理服务器,而最左端的IP地址表示最初发起请求的客户端的IP地址。
示例
X-Forwarded-For: 2001:db8:85a3:8d3:1319:8a2e:370:7348
X-Forwarded-For: 203.0.113.195
X-Forwarded-For: 203.0.113.195, 70.41.3.18, 150.172.238.178
XForwarded Headers Filter 在发向下游前可以创建一系列的X-Forwarded-* headers。它会使用当前请求的Host header, scheme, port 和path 去创建对应的headers。
通过下面的属性可以控制对应header的创建(默认为true):
- spring.cloud.gateway.x-forwarded.for-enabled
- spring.cloud.gateway.x-forwarded.host-enabled
- spring.cloud.gateway.x-forwarded.port-enabled
- spring.cloud.gateway.x-forwarded.proto-enabled
- spring.cloud.gateway.x-forwarded.prefix-enabled
当header已经存在时,通过下面的属性控制是否添加值到对应的header(默认为true):
- spring.cloud.gateway.x-forwarded.for-append
- spring.cloud.gateway.x-forwarded.host-append
- spring.cloud.gateway.x-forwarded.port-append
- spring.cloud.gateway.x-forwarded.proto-append
- spring.cloud.gateway.x-forwarded.prefix-append
Spring Cloud Gateway 2.2.3 官方使用说明(1)–路由
Spring Cloud Gateway 2.2.3 官方使用说明(2)-- 路由filter(上)
Spring Cloud Gateway 2.2.3 官方使用说明(2)-- 路由filter(下)
Spring Cloud Gateway 2.2.3 官方使用说明(3)-- Global filter
Spring Cloud Gateway 2.2.3 使用说明(5)-- TLS 和 SSL
Spring Cloud Gateway 2.2.3 使用说明(6)-- 其它配置
Spring Cloud Gateway 2.2.3 使用说明(7)-- actuator
Spring Cloud Gateway 2.2.3 使用说明(8)-- 开发指导