實務上需考慮 Proxy、CDN、Load Balancer 等導致 $_SERVER['REMOTE_ADDR'] 非真實客戶端 IP。本文提供完整 getClientIp() 與串接淘寶 IP 庫 getIpInfo()。
function getClientIp($type = 0) {
$ip = null;
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$pos = array_search('unknown', $arr);
if ($pos !== false) unset($arr[$pos]);
$ip = trim($arr[0]);
} elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (isset($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDR'];
}
$long = sprintf("%u", ip2long($ip));
return $type ? $long : $ip;
}
function getIpInfo($ip) {
if (is_int($ip)) $ip = long2ip($ip);
$api = 'https://ip.taobao.com/service/getIpInfo.php';
$json = @file_get_contents($api . '?ip=' . $ip);
if (!$json) return [];
$data = json_decode($json, true);
return ($data['code'] ?? 1) === 0 ? $data['data'] : [];
}
Array
(
[country] => 中國
[region] => 廣東
[city] => 深圳
[isp] => 電信
[area_id] => 440300
...
)
$ip = getClientIp();
$info = getIpInfo($ip);
echo "訪客 IP: $ip\n";
echo "所在地: {$info['country']} {$info['region']} {$info['city']} {$info['isp']}\n";
CF-Connecting-IP 等標頭HTTP_X_FORWARDED_FOR 可偽造,關鍵業務(登入、風控)請配合裝置指紋、行為分析完整 IP 解析方案 = 正確取 IP + 可靠查詢源 + 快取 + 風控邏輯。