フォワードヘッダー
必須の依存関係: 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なし | 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-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-*ヘッダーから値を抽出するためのカスタムロジックを提供できます。
