フォワードヘッダー
必須の依存関係: io.ktor:ktor-server-forwarded-header
コード例: forwarded-header
ForwardedHeadersとXForwardedHeadersプラグインは、Ktorサーバーがリバースプロキシの背後に配置されている場合に、リバースプロキシヘッダーを処理して元のリクエストに関する情報を取得できるようにします。これはロギング目的で役立つ場合があります。
ForwardedHeaders
はForwarded
ヘッダー(RFC 7239)を処理します。XForwardedHeaders
は以下のX-Forwarded-
ヘッダーを処理します。X-Forwarded-Host
/X-Forwarded-Server
X-Forwarded-For
X-Forwarded-By
X-Forwarded-Proto
/X-Forwarded-Protocol
X-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-3
skipKnownProxies
は、リストから指定されたエントリを削除し、最後のエントリを取得します。例えば、この関数にlistOf("proxy-1", "proxy-3")
を渡すと、以下のヘッダーに対してorigin.remoteHost
はproxy-2
を返します。HTTPX-Forwarded-For: 10.0.0.123, proxy-1, proxy-2, proxy-3
extractEdgeProxy
は、X-Forward-*
ヘッダーから値を抽出するためのカスタムロジックを提供できます。