どうも、タカフです。
本日は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を取得する時は常に上記コードの取得方法で書いておくといいかもしれません。
現場からは以上です。