You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过PHP客户端发送GET请求获取用户真实IP?

获取客户端真实IP的正确方式

嘿,这个问题其实很常见——你现在的思路搞反了方向!你用file_get_contents('https://api.ipify.org/')是让你的服务器自己发起请求去查IP,那返回的自然是服务器的公网IP,根本碰不到用户的真实IP。要拿到用户的真实IP,得从用户访问你服务器时发送的请求头里提取信息。

核心原理

用户访问你的PHP服务时,HTTP请求头里会携带他们的IP相关信息。我们可以通过PHP的$_SERVER超全局变量来获取这些信息,不过要注意区分直接访问和通过代理、CDN访问的场景。

具体实现方法

这里给你一个经过验证的实用函数,能覆盖大部分场景,同时做了基本的合法性校验:

function getClientRealIP() {
    $ip = '';
    // 处理代理/CDN场景下的真实IP传递
    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        // 多个代理串联时,第一个IP是用户真实IP
        $ipList = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        $ip = trim($ipList[0]);
    } elseif (!empty($_SERVER['HTTP_X_REAL_IP'])) {
        $ip = $_SERVER['HTTP_X_REAL_IP'];
    } elseif (!empty($_SERVER['REMOTE_ADDR'])) {
        // 最基础的情况:直接获取连接到服务器的IP
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    
    // 验证IP格式合法性,过滤伪造的无效值
    if (filter_var($ip, FILTER_VALIDATE_IP)) {
        return $ip;
    } else {
        return '未知IP';
    }
}

// 使用示例
$userRealIP = getClientRealIP();
echo $userRealIP;

关键注意事项

  • HTTP_X_FORWARDED_FOR、HTTP_X_REAL_IP这类自定义头是可以被伪造的,如果你的服务涉及敏感操作,建议结合服务器配置(比如Nginx/Apache只信任特定代理的头)来避免篡改。
  • 如果你的网站用了Cloudflare这类CDN,需要确保CDN已正确传递用户真实IP(比如Cloudflare会用CF-Connecting-IP字段),可以在函数里额外添加对该字段的判断。

再理清楚为什么原来的方法不行

file_get_contents('https://api.ipify.org/')是服务器作为独立客户端去请求外部接口,这个请求和用户的访问请求完全无关,所以接口返回的是发起请求的主体(也就是你的服务器)的IP,自然不是用户的。

内容的提问来源于stack exchange,提问作者RequireBool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:59:54