通常、クライアントのIPアドレスはREMOTE_ADDRで取得できる。
// クライアントのIPアドレスを取得するPHPのコード
$ip = $_SERVER['REMOTE_ADDR'];
HTTPプロキシやロードバランサーを通過して接続したクライアントのIPアドレスは、REMOTE_ADDRでは取得できない。
REMOTE_ADDRは、HTTPプロキシやロードバランサーのIPアドレスになる。
では、どうすれば取得できるのかというと、X-Forwarded-Forを使用する。
X-Forwarded-Forの構文は次のようになっている。
X-Forwarded-For: <client>, <proxy1>, <proxy2>
カンマで区切られたIPアドレスのうち、一番左のIPアドレスがクライアントのIPアドレスになる。
HTTPプロキシやロードバランサーを通過して接続したクライアントのIPアドレスを取得するPHPのコードは次のようになる。
/**
* HTTPプロキシやロードバランサーを通過して接続したクライアントのIPアドレスを取得する
* @return string
*/
function getClientIpAddress() {
if (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)) {
$xForwardedFor = explode(",", $_SERVER['HTTP_X_FORWARDED_FOR']);
if (!empty($xForwardedFor)) {
return trim($xForwardedFor[0]);
}
}
if (isset($_SERVER['REMOTE_ADDR'])) {
return (string)$_SERVER['REMOTE_ADDR'];
}
return "";
}