現象
アクセスしてきているクライアントのIPアドレスを取得する必要があり、play.api.mvc.Request
のremoteAddress()
で期待していた結果を取得できなかった。
インフラの構成によると思いますが、自分の場合、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 + "]")
}