Skip to content
Server Plugin

フォワードヘッダー

必須の依存関係: io.ktor:ktor-server-forwarded-header

コード例: forwarded-header

ネイティブサーバー
KtorはKotlin/Nativeをサポートしており、追加のランタイムや仮想マシンなしでサーバーを実行できます。
のサポート: ✅

ForwardedHeadersXForwardedHeadersプラグインは、Ktorサーバーがリバースプロキシの背後に配置されている場合に、リバースプロキシヘッダーを処理して元のリクエストに関する情報を取得できるようにします。これはロギング目的で役立つ場合があります。

  • ForwardedHeadersForwardedヘッダー(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アーティファクトを含める必要があります。

Kotlin
Groovy
XML

プラグインのインストール

アプリケーションにForwardedHeadersプラグインをインストールするには、 指定された

モジュール
モジュールを使用すると、ルートをグループ化してアプリケーションを構造化できます。
内のinstall関数に渡します。 以下のコードスニペットは、ForwardedHeadersをインストールする方法を示しています...

  • ... embeddedServer関数呼び出し内で。
  • ... Applicationクラスの拡張関数である、明示的に定義されたmodule内で。
kotlin
kotlin

アプリケーションにXForwardedHeadersプラグインをインストールするには、 指定された

モジュール
モジュールを使用すると、ルートをグループ化してアプリケーションを構造化できます。
内のinstall関数に渡します。 以下のコードスニペットは、XForwardedHeadersをインストールする方法を示しています...

  • ... embeddedServer関数呼び出し内で。
  • ... Applicationクラスの拡張関数である、明示的に定義されたmodule内で。
kotlin
kotlin

ForwardedHeaders/XForwardedHeadersをインストールすると、call.request.originプロパティを使用して元のリクエストに関する情報を取得できます。

リクエスト情報の取得

プロキシリクエスト情報

プロキシリクエストに関する情報を取得するには、ルートハンドラ内でcall.request.localプロパティを使用します。以下のコードスニペットは、プロキシアドレスとリクエストが送信されたホストに関する情報を取得する方法を示しています。

kotlin
get("/hello") {
    val remoteHost = call.request.local.remoteHost
    val serverHost = call.request.local.serverHost
}

元のリクエスト情報

元のリクエストに関する情報を読み取るには、call.request.originプロパティを使用します。

kotlin
get("/hello") {
    val originRemoteHost = call.request.origin.remoteHost
    val originServerHost = call.request.origin.serverHost
}

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

Request diagram

プロパティForwardedHeadersなしForwarderHeadersあり
origin.localHostweb-serverweb-server
origin.localPort80808080
origin.serverHostweb-serverproxy
origin.serverPort808080
origin.remoteHostproxyclient
origin.remotePort3286432864

完全な例はこちらで見つけることができます: forwarded-header

ForwardedHeadersの構成

リクエストが複数のプロキシを経由する場合、ForwardedHeaders/XForwardedHeadersを構成する必要がある場合があります。この場合、X-Forwarded-Forには各連続するプロキシのすべてのIPアドレスが含まれます。例えば、以下のようになります。

HTTP
X-Forwarded-For: <client>, <proxy1>, <proxy2>

デフォルトでは、XForwardedHeaderX-Forwarded-Forの最初のエントリをcall.request.origin.remoteHostプロパティに割り当てます。IPアドレスの選択のためにカスタムロジックを提供することもできます。XForwardedHeadersConfigは、これに以下のAPIを公開しています。

  • useFirstProxyuseLastProxyは、IPアドレスのリストからそれぞれ最初または最後の値を取得できます。

  • skipLastProxiesは、右から指定された数のエントリをスキップし、次のエントリを取得します。例えば、proxiesCountパラメーターが3に等しい場合、以下のヘッダーに対してorigin.remoteHost10.0.0.123を返します。

    HTTP
    X-Forwarded-For: 10.0.0.123, proxy-1, proxy-2, proxy-3
  • skipKnownProxiesは、リストから指定されたエントリを削除し、最後のエントリを取得します。例えば、この関数にlistOf("proxy-1", "proxy-3")を渡すと、以下のヘッダーに対してorigin.remoteHostproxy-2を返します。

    HTTP
    X-Forwarded-For: 10.0.0.123, proxy-1, proxy-2, proxy-3
  • extractEdgeProxyは、X-Forward-*ヘッダーから値を抽出するためのカスタムロジックを提供できます。