php 获取本机外网/公网IP的代码大家一般都是用$_SERVER[‘REMOTE_ADDR’]来获取用户IP, 但是如果使用了反向代理的,HTTP头中REMOTE_ADDR就不是用户的地址,反而是上一级代理的地址了。 经过我的研究有两种方法来获取用户的真实外网IP。 方法一:curl 复制代码 代码如下: function get_onlineip() { $ch = curl_init(‘http://www.ip138.com/ip2city.asp’); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $a = curl_exec($ch); preg_match(‘/\[ 在PHP编程中,正确获取用户的外网或公网IP地址是一个常见的需求,特别是在处理网络请求时,需要识别用户的真实位置信息。然而,由于网络环境的复杂性,如使用代理服务器、NAT转换等,直接通过`$_SERVER['REMOTE_ADDR']`获取的IP地址可能并不准确。以下将详细介绍两种有效的方法来解决这个问题。 ### 方法一:使用cURL获取IP 当用户通过代理服务器访问网站时,`REMOTE_ADDR`会记录代理服务器的IP而非用户的真实IP。这时,可以通过cURL工具访问一个可以返回用户真实IP的第三方服务,例如`http://www.ip138.com/ip2city.asp`,这个服务能够识别并返回用户的真实外网IP。以下是相关的PHP代码: ```php function get_onlineip() { $ch = curl_init('http://www.ip138.com/ip2city.asp'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $a = curl_exec($ch); preg_match('/\[(.*)\]/', $a, $ip); return $ip[1]; } ``` 这个函数首先初始化cURL会话,然后设置选项使其不显示页面内容,而是将其作为字符串返回。接着执行cURL请求,最后通过正则表达式匹配返回的HTML内容,提取出IP地址。 ### 方法二:检查HTTP头部信息 另一种方法是检查HTTP头部中的`X-Forwarded-For`字段,这个字段通常包含了经过代理服务器转发的原始IP地址。如果服务器使用了多个代理,`X-Forwarded-For`可能包含一系列IP地址,所以需要获取列表中的第一个非"unknown"的值。以下是相关代码: ```php function get_onlineip() { $onlineip = ''; if (getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) { $onlineip = getenv('HTTP_CLIENT_IP'); } elseif (getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) { $onlineip = getenv('HTTP_X_FORWARDED_FOR'); // 分割X-Forwarded-For中的IP地址,并取第一个非"unknown"的IP $ips = explode(',', $onlineip); foreach ($ips as $ip) { if (strcasecmp(trim($ip), 'unknown') !== 0) { $onlineip = trim($ip); break; } } } elseif (getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) { $onlineip = getenv('REMOTE_ADDR'); } elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) { $onlineip = $_SERVER['REMOTE_ADDR']; } return $onlineip; } ``` 这个函数首先检查`HTTP_CLIENT_IP`,然后是`HTTP_X_FORWARDED_FOR`,如果这两个都不行,再尝试`REMOTE_ADDR`。在处理`HTTP_X_FORWARDED_FOR`时,需要注意可能存在多个IP地址,所以需要筛选出第一个有效IP。 ### 其他相关知识点 1. **$_SERVER数组**: 这是PHP内置的一个全局变量数组,包含了诸如HTTP头信息、脚本路径、服务器环境变量等与请求相关的信息。 2. **HTTP头信息**: `REMOTE_ADDR`通常表示客户端的IP地址,但当请求经过代理时,这个值会被代理服务器的IP覆盖。`HTTP_X_FORWARDED_FOR`是一个非标准但常用的HTTP头,用于指示客户端的原始IP。 3. **cURL库**: PHP的cURL库提供了丰富的功能,可以用来发送HTTP请求,模拟浏览器行为,获取响应数据等。 4. **正则表达式**: 在PHP中,`preg_match`函数用于执行模式匹配,这里用于从HTML内容中提取IP地址。 5. **代理服务器与NAT**: 代理服务器用于转发客户端的请求,而NAT(网络地址转换)则是在内网与外网之间转换IP地址,两者都可能导致`REMOTE_ADDR`不能直接获取到用户的真实IP。 理解并熟练运用这些方法和知识点,可以帮助开发者在各种网络环境中准确地获取到用户的真实IP地址,这对于网络应用的统计分析、安全防护以及地理位置服务等功能至关重要。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。