如何在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
相关产品推荐
相关产品推荐

