function getIpAddress()
{
// Check for shared internet/ISP IP
if (!empty($_SERVER['HTTP_CLIENT_IP']) && validateIp($_SERVER['HTTP_CLIENT_IP'])) {
return $_SERVER['HTTP_CLIENT_IP'];
}

// Check for IPs passing through proxies
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
// Check if multiple IP addresses exist in var
$iplist = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
foreach ($iplist as $ip) {
if (validateIp($ip)) {
return $ip;
}
}
}

if (!empty($_SERVER['HTTP_X_FORWARDED']) && validateIp($_SERVER['HTTP_X_FORWARDED'])) {
return $_SERVER['HTTP_X_FORWARDED'];
}

if (!empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']) && validateIp($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) {
return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
}

if (!empty($_SERVER['HTTP_FORWARDED_FOR']) && validateIp($_SERVER['HTTP_FORWARDED_FOR'])) {
return $_SERVER['HTTP_FORWARDED_FOR'];
}

if (!empty($_SERVER['HTTP_FORWARDED']) && validateIp($_SERVER['HTTP_FORWARDED'])) {
return $_SERVER['HTTP_FORWARDED'];
}

if (isset($_SERVER["HTTP_CF_CONNECTING_IP"])) { //cloudflare
return $_SERVER["HTTP_CF_CONNECTING_IP"];
}
// Return unreliable IP address since all else failed
return $_SERVER['REMOTE_ADDR'];
}

function validateIp($ip)
{
if (filter_var($ip, FILTER_VALIDATE_IP,
FILTER_FLAG_IPV4 |
FILTER_FLAG_IPV6 |
FILTER_FLAG_NO_PRIV_RANGE |
FILTER_FLAG_NO_RES_RANGE) === false) {
return false;
}

return true;
}