
本文详解为何调用 ipify api 会返回网站服务器 ip,而非用户真实 ip,并提供安全、可靠、兼容 cdn(如 cloudflare)的 php 客户端 ip 获取方案,支持自动降级与 ipv4 格式强制统一。
本文详解为何调用 ipify api 会返回网站服务器 ip,而非用户真实 ip,并提供安全、可靠、兼容 cdn(如 cloudflare)的 php 客户端 ip 获取方案,支持自动降级与 ipv4 格式强制统一。
https://api4.ipify.org 是一个服务端外网出口 IP 查询接口——它返回的是你运行 PHP 脚本的那台服务器(即你的 Web 服务器)所连接互联网时的公网 IP,而非访问你网站的用户设备 IP。因此,无论多少人访问,只要请求都经由同一台服务器发起,结果永远是该服务器的 IP。这与获取“客户端真实 IP”完全无关。
要获取用户真实 IP,必须依赖 HTTP 请求头或服务器环境变量。推荐采用多层可信源校验 + IPv4 强制归一化的安全策略:
<?php
function getClientIp(): string {
// 优先检查 Cloudflare 等可信 CDN 提供的真实 IP 头(需确保 CDN 已配置并启用)
if (!empty($_SERVER['HTTP_CF_CONNECTING_IP'])) {
$ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
// 取 X-Forwarded-For 首个非私有 IP(注意:此头可被伪造,仅限可信代理链使用)
$ips = array_map('trim', explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']));
foreach ($ips as $candidate) {
if (filter_var($candidate, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
$ip = $candidate;
break;
}
}
}
// 最终兜底:REMOTE_ADDR(始终存在,且不可伪造,代表直接连接的上一跳 IP)
$ip ??= $_SERVER['REMOTE_ADDR'] ?? '127.0.0.1';
// 强制转换为 IPv4(若为 IPv6 则尝试映射或丢弃;此处采用安全降级:仅保留 IPv4)
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
return $ip;
} elseif (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
// 可选:IPv6 → IPv4 映射(仅适用于 IPv4-mapped IPv6 地址,如 ::ffff:192.0.2.1)
if (strpos($ip, '::ffff:') === 0) {
return substr($ip, 7);
}
// 否则返回默认内网地址或抛出警告(生产环境建议记录日志而非暴露)
return '0.0.0.0'; // 或 throw new RuntimeException("IPv6 client not supported");
}
return '0.0.0.0'; // 非法 IP,防御性默认值
}
$realIp = getClientIp();
echo "User's IPv4 address is: " . $realIp;
?>✅ 关键说明与注意事项:
-
$_SERVER['REMOTE_ADDR']永远是最可靠的基础来源,它表示与当前 Web 服务器建立 TCP 连接的直接对端 IP(无法被 HTTP 请求头伪造); -
HTTP_CF_CONNECTING_IP等 CDN 头仅在你明确使用 Cloudflare、AWS ALB、Nginx 反向代理等可信中间层且已正确配置set_real_ip_from/real_ip_header时才可信; -
切勿无条件信任
X-Forwarded-For—— 它可被客户端任意设置,仅应在反向代理可控环境下启用,并配合trusted proxies白名单校验; - 上述代码通过
FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE排除私有网段(如192.168.x.x)和保留地址,提升安全性; - 若业务严格要求 IPv4,该方案自动剥离 IPv6,避免后续处理异常(如数据库字段长度不足、日志解析失败等)。
总结:放弃调用外部 API 获取用户 IP,转而构建健壮的服务器端 IP 解析逻辑——兼顾准确性、安全性与协议兼容性,才是生产环境的最佳实践。

















