PHP 获取用户真实 IP 地址的正确做法
本文介绍了如何使用 PHP 代码获取用户的真实 IP 地址,重点解析了在不同网络环境(如使用 CDN 或反向代理)下正确识别 IP 的方法。
为什么需要正确处理 IP 获取
在许多 Web 应用场景中,记录用户 IP 是基础需求,例如安全审计、访问统计、频率限制等。然而,由于现代网络架构中广泛使用了 Nginx 反代、CDN 加速或负载均衡器,直接读取 $_SERVER['REMOTE_ADDR'] 往往只能获得代理服务器的 IP,而非用户真实的公网 IP。因此,编写健壮 IP 获取函数至关重要。
标准 PHP IP 获取代码
以下代码通过层层判断环境变量,尝试从多个常见头信息中获取真实 IP。如果所有可信来源均不可用,则回退到默认的连接端点地址。
<?php
/**
* 获取客户端真实 IP 地址
*/
function get_client_ip() {
// 1. 优先检查 HTTP_CLIENT_IP (较少见,但兼容旧系统)
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
}
// 2. 检查 HTTP_X_FORWARDED_FOR (反向代理/CDN 常见)
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
// 3. 最后检查 REMOTE_ADDR (直接连接 IP)
elseif (!empty($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDR'];
} else {
$ip = 'unknown';
}
// 可选:如果是 X-Forwarded-For,可能包含多个 IP,取第一个
if (strpos($ip, ',') !== false) {
$ip = trim(explode(',', $ip)[0]);
}
return $ip;
}
echo "你的IP地址是:" . get_client_ip();
?>
第 1 步:理解关键环境变量
在使用上述代码前,了解各个 $_SERVER 变量的含义有助于调试:
REMOTE_ADDR: 客户端最近的 IP 地址。如果是直接访问服务器,这是真实 IP;如果经过代理,则是代理的 IP。HTTP_X_FORWARDED_FOR: 当前端透过代理连接到服务器时,记录了原始客户端的 IP。格式通常为client, proxy1, proxy2。HTTP_CLIENT_IP: 一些代理服务器设置的头信息,优先级较低,安全性也较差,因为容易伪造。
第 2 步:安全风险提示
在处理 X-Forwarded-For 等头信息时,务必注意:这些头信息可以由客户端随意伪造。如果你的应用依赖 IP 进行鉴权或限流,请确保你的 Web 服务器(如 Nginx)只信任来自内部代理的网络段,并在入口处清洗这些头信息,否则攻击者可以轻易伪造 IP 绕过限制。
总结
获取 IP 地址看似简单,但在分布式网络环境中需要谨慎处理。推荐使用上面的多级判断逻辑,并结合服务器端的访问日志或专业的 WAF 服务来确保数据的准确性。以上就是 PHP 获取本地 IP 地址相关代码的详细内容,更多关于 PHP 网络编程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









