Skip to content
Server Plugin

Forwardedヘッダー

必要な依存関係: io.ktor:ktor-server-forwarded-header

コード例: forwarded-header

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

ForwardedHeaders および XForwardedHeaders プラグインを使用すると、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 によって公開されるさまざまなプロパティの値を示しています。

リクエスト図

プロパティForwardedHeadersなしForwardedHeadersあり
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を公開しています。

  • useFirstProxy および useLastProxy を使用すると、それぞれ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-* ヘッダーから値を抽出するためのカスタムロジックを提供できます。