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

如何在PHP中使用用户IP而非服务器IP发起CURL请求

用PHP CURL发起请求时使用用户IP而非服务器IP

你的CURL代码是在服务器端执行的,默认会走服务器的网络发起请求,所以目标网站返回的是服务器IP。要让目标网站识别为用户的IP发起请求,需要先获取访问当前页面的用户真实IP,再通过请求头传递给目标服务器(前提是目标服务器支持解析这类自定义请求头)。

步骤1:获取用户真实IP

用户可能经过代理访问你的服务,所以需要多维度检查请求头来拿到真实IP:

function getUserRealIP() {
    $ip = '';
    // 优先检查X-Forwarded-For(代理场景常用)
    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        foreach ($ips as $val) {
            $val = trim($val);
            // 验证IP格式,排除内网/保留IP
            if (filter_var($val, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
                $ip = $val;
                break;
            }
        }
    } 
    // 其次检查X-Real-IP
    elseif (!empty($_SERVER['HTTP_X_REAL_IP'])) {
        $ip = $_SERVER['HTTP_X_REAL_IP'];
    } 
    // 最后取直接连接的IP
    else {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}

步骤2:修改CURL代码,添加用户IP请求头

把获取到的用户IP通过X-Forwarded-For和X-Real-IP头传递给目标服务器:

$userIp = getUserRealIP();
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://opsukrat.in/ip.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
// 添加请求头,模拟用户IP发起请求
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    "X-Forwarded-For: {$userIp}",
    "X-Real-IP: {$userIp}"
]);
$ip = curl_exec($ch);
curl_close($ch);

注意事项

  • 只有当目标服务器https://opsukrat.in/ip.php会解析X-Forwarded-For或X-Real-IP头时,才会返回用户IP;如果目标服务器只识别直接请求的IP,那这个方法不生效。
  • 如果你自己的服务器部署在反向代理(如Nginx、Cloudflare)后面,需要先配置代理传递真实IP,否则$_SERVER里的头字段可能不准确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 11:48:17