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
}以下の表は、ForwardedHeaders/XForwardedHeaders がインストールされているかどうかに応じて、call.request.origin によって公開されるさまざまなプロパティの値を示しています。

| プロパティ | 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は、リストから指定されたエントリを削除し、最後のエントリを取得します。 たとえば、この関数にlistOf("proxy-1", "proxy-3")を渡すと、以下のヘッダーに対してorigin.remoteHostはproxy-2を返します。HTTPX-Forwarded-For: 10.0.0.123, proxy-1, proxy-2, proxy-3extractEdgeProxyを使用すると、X-Forward-*ヘッダーから値を抽出するためのカスタムロジックを提供できます。
