轉送標頭
所需依賴項: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 | 已安裝 ForwarderHeaders |
|---|---|---|
origin.localHost | 網頁伺服器 | 網頁伺服器 |
origin.localPort | 8080 | 8080 |
origin.serverHost | 網頁伺服器 | 代理 |
origin.serverPort | 8080 | 80 |
origin.remoteHost | 代理 | 客戶端 |
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會從列表中移除指定的條目並取得最後一個條目。 例如,如果您將listOf("proxy-1", "proxy-3")傳遞給此函數,對於以下標頭,origin.remoteHost將返回proxy-2:HTTPX-Forwarded-For: 10.0.0.123, proxy-1, proxy-2, proxy-3extractEdgeProxy允許您提供自訂邏輯來從X-Forward-*標頭中提取值。
