Forwarded 标头
所需依赖项:io.ktor:ktor-server-forwarded-header
代码示例: forwarded-header
ForwardedHeaders 和 XForwardedHeaders 插件允许您在 Ktor 服务器位于反向代理之后时,通过处理反向代理标头来获取有关原始请求的信息。这对于日志记录很有用。
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 构件:
安装插件
安装 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 | 已安装 ForwarderHeaders |
|---|---|---|
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-Forward-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从列表中移除指定的条目并获取最后一个条目。 例如,如果您将listOf("proxy-1", "proxy-3")传递给此函数,对于下方的标头,origin.remoteHost将返回proxy-2:HTTPX-Forwarded-For: 10.0.0.123, proxy-1, proxy-2, proxy-3extractEdgeProxy允许您提供从X-Forward-*标头中提取值的自定义逻辑。
