PlayFramework

PlayFramework(2.5.14)でIPアドレスを取得する時にハマった

現象

アクセスしてきているクライアントのIPアドレスを取得する必要があり、play.api.mvc.RequestremoteAddress()で期待していた結果を取得できなかった。
インフラの構成によると思いますが、自分の場合、Webサーバーとして立てていたNginxのIPアドレスが取得されました。

HomeController.scala
def index = Action { request =>
  // NginxのIPアドレスが取得された
  val clientIp = request.remoteAddress
  Ok("clientIp[" + clientIp + "]")
}

原因

調べるとどうやらremoteAddress()はHTTPヘッダのX-Forwarded-Forを返すと分かりました。
この時、X-Forwarded-Forであればclient1, proxy1(Nginx)といった形で取得できるのではと思いましたが、
Nginxの設定を見返すとX-Forwarded-Forの設定が抜けていました・・・

クライアントのIPアドレスだけ取得する

取得したかったのはクライアントのIPアドレスだけだったので、以下の実装に修正しました。

HomeController.scala
def index = Action { request =>
  val xForwardedFor = request.headers.get("X-Forwarded-For").getOrElse("")
  val clientIp = xForwardedFor.split(",").headOption.getOrElse("")

  Ok("clientIp[" + clientIp + "]")
}