转发标头
所需依赖项: io.ktor:ktor-server-forwarded-header
代码示例: forwarded-header
当 Ktor 服务器位于反向代理之后时,ForwardedHeaders 和 XForwardedHeaders 插件允许您处理反向代理标头,以获取有关原始请求的信息。这对于日志记录目的可能很有用。
ForwardedHeaders处理Forwarded标头 (RFC 7239)XForwardedHeaders处理以下X-Forwarded-标头:X-Forwarded-Host/X-Forwarded-ServerX-Forwarded-ForX-Forwarded-ByX-Forwarded-Proto/X-Forwarded-ProtocolX-Forwarded-SSL/Front-End-Https
为防止篡改
Forwarded标头,如果您的应用程序仅接受反向代理连接,请安装这些插件。
添加依赖项
要使用 ForwardedHeaders/XForwardedHeaders 插件,您需要在构建脚本中包含 ktor-server-forwarded-header artifact:
安装插件
安装 ForwardedHeaders/XForwardedHeaders 后,您可以使用 call.request.origin 属性获取原始请求的信息。
获取请求信息
代理请求信息
要获取代理请求信息,请在 路由处理器 内部使用 call.request.local 属性。 下面的代码片段展示了如何获取代理地址和请求目标主机的信息:
get("/hello") {
val remoteHost = call.request.local.remoteHost
val serverHost = call.request.local.serverHost
}原始请求信息
要读取原始请求信息,请使用 call.request.origin 属性:
get("/hello") {
val originRemoteHost = call.request.origin.remoteHost
val originServerHost = call.request.origin.serverHost
}下表显示了 call.request.origin 暴露的不同属性值,具体取决于是否安装了 ForwardedHeaders/XForwardedHeaders。

| 属性 | 未安装 ForwardedHeaders | 已安装 ForwardedHeaders |
|---|---|---|
origin.localHost | web-server | web-server |
origin.localPort | 8080 | 8080 |
origin.serverHost | web-server | proxy |
origin.serverPort | 8080 | 80 |
origin.remoteHost | proxy | client |
origin.remotePort | 32864 | 32864 |
您可以在此处找到完整示例:forwarded-header。
配置 ForwardedHeaders
如果请求通过多个代理,您可能需要配置 ForwardedHeaders/XForwardedHeaders。 在这种情况下,X-Forwarded-For 包含每个连续代理的所有 IP 地址,例如:
X-Forwarded-For: <client>, <proxy1>, <proxy2>默认情况下,XForwardedHeader 将 X-Forwarded-For 中的第一个条目赋值给 call.request.origin.remoteHost 属性。 您还可以提供自定义逻辑来选择 IP 地址。 XForwardedHeadersConfig 为此暴露了以下 API:
useFirstProxy和useLastProxy分别允许您从 IP 地址列表中获取第一个或最后一个值。skipLastProxies跳过从右侧开始的指定数量的条目,然后获取下一个条目。 例如,如果proxiesCount形参等于3,则对于下面的标头,origin.remoteHost将返回10.0.0.123:HTTPX-Forwarded-For: 10.0.0.123, proxy-1, proxy-2, proxy-3skipKnownProxies从列表中移除指定条目,然后获取最后一个条目。 例如,如果您将list("proxy-1", "proxy-3")传递给此函数,则对于下面的标头,origin.remoteHost将返回proxy-2:HTTPX-Forwarded-For: 10.0.0.123, proxy-1, proxy-2, proxy-3extractEdgeProxy允许您提供自定义逻辑,用于从X-Forward-*标头中提取值。
