【AWS】前段CloudFrontでのREMOTE_ADDRを取得する方法

どうも、タカフです。

本日はAWSのCloudFrontをかましているサーバーで、クライアントの接続元IPアドレスを取得する方法です。

これ、最初地味にハマるんですよね。PHPで普通に接続元クライアントのIPアドレスを取得する時は

$ip = $_SERVER['REMOTE_ADDR'];

だけで済むんですが、AWSでCloudFrontやELB・ALBをかましている時は、REMOTE_ADDRには直前の接続元IPが入ってしまうので、他のヘッダーから取得します。
で、AWS側には別のヘッダーが用意されているのでそれを取得します。HTTP_X_FORWARDED_FORを使います。

if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
  $ipArray = array_map('trim', explode(',', $_SERVER["HTTP_X_FORWARDED_FOR"]));
  $ip      = $ipArray[0];
} else {
  $ip = $_SERVER['REMOTE_ADDR'];
}

ポイントとしては、HTTP_X_FORWARDED_FORの中には経由した分だけのIPアドレスがカンマ区切りで代入されているので、explodeして最初の値を取得することです。また、カンマ前後に空白が入っている事があるのでarray_mapでtrimしておきましょう。

最近ではクラウドベースのWebシステムが当たり前になってきて、ロードバランサーやプロキシサーバーがあることの方が普通だったりしますので、クライアントの接続IPを取得する時は常に上記コードの取得方法で書いておくといいかもしれません。

現場からは以上です。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です