在PHP编程中,获取访客的IP地址是常见的需求,特别是在网站统计、用户跟踪或安全防护等场景。`REMOTE_ADDR`是PHP中的一个预定义服务器变量,它包含了远程客户端(即浏览器)的IP地址。然而,由于网络环境的复杂性,如代理服务器、负载均衡器等,单一使用`REMOTE_ADDR`可能无法获取到准确的IP地址。因此,我们需要考虑多种可能的情况来获取真实的访客IP。 最直接的方式就是通过`$_SERVER["REMOTE_ADDR"]`来获取。这段代码`$iipp=$_SERVER["REMOTE_ADDR"]; echo $iipp;`简单明了,直接打印出服务器接收到的客户端请求的IP地址。但请注意,如果用户通过代理服务器访问,这个IP可能是代理服务器的IP,而非实际用户的IP。 为了解决这个问题,我们可以检查其他HTTP头信息,比如`HTTP_X_FORWARDED_FOR`和`HTTP_CLIENT_IP`。这些头信息通常由代理服务器设置,表示原始请求者的IP。例如: ```php $user_IP = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"]; $user_IP = ($user_IP) ? $user_IP : $_SERVER["REMOTE_ADDR"]; echo $user_IP; ``` 上面的代码首先尝试从`HTTP_X_FORWARDED_FOR`获取IP,如果没有,则使用`REMOTE_ADDR`。但是`HTTP_X_FORWARDED_FOR`可能会包含多个IP地址(当有多级代理时),因此需要进一步处理。 为了获取最接近真实用户来源的IP,可以使用以下函数`get_real_ip()`: ```php function get_real_ip(){ $ip=false; if(!empty($_SERVER["HTTP_CLIENT_IP"])){ $ip = $_SERVER["HTTP_CLIENT_IP"]; } // 处理HTTP_X_FORWARDED_FOR,从左到右找到第一个非内网IP if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']); if ($ip) { array_unshift($ips, $ip); $ip = FALSE; } for ($i = 0; $i < count($ips); $i++) { if (!eregi ("^(10|172.16|192.168).", $ips[$i])) { $ip = $ips[$i]; break; } } } return ($ip ? $ip : $_SERVER['REMOTE_ADDR']); } echo get_real_ip(); ``` 此函数首先检查`HTTP_CLIENT_IP`,然后遍历`HTTP_X_FORWARDED_FOR`的IP列表,跳过内网IP(如10.x.x.x, 172.16.x.x-172.31.x.x, 192.168.x.x),返回第一个找到的非内网IP。如果所有尝试都失败,就返回`REMOTE_ADDR`。 此外,还有一些使用`HTTP_SERVER_VARS`和`getenv()`来获取IP的示例,它们与`$_SERVER`变量类似,但在旧版本的PHP或某些特定环境下可能更适用: ```php if ($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"]) { $ip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"]; } elseif ($HTTP_SERVER_VARS["HTTP_CLIENT_IP"]) { $ip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"]; } elseif ($HTTP_SERVER_VARS["REMOTE_ADDR"]) { $ip = $HTTP_SERVER_VARS["REMOTE_ADDR"]; } elseif (getenv("HTTP_X_FORWARDED_FOR")) { $ip = getenv("HTTP_X_FORWARDED_FOR"); } elseif (getenv("HTTP_CLIENT_IP")) { $ip = getenv("HTTP_CLIENT_IP"); } elseif (getenv("REMOTE_ADDR")) { $ip = getenv("REMOTE_ADDR"); } else { $ip = "Unknown"; } echo "你的IP:".$ip ; ``` 以及 ```php if(getenv('HTTP_CLIENT_IP')) { $onlineip = getenv('HTTP_CLIENT_IP'); } elseif(getenv('HTTP_X_FORWARDED_FOR')) { $onlineip = getenv('HTTP_X_FORWARDED_FOR'); } elseif(getenv('REMOTE_ADDR')) { $onlineip = getenv('REMOTE_ADDR'); } else { $onlineip = $HTTP_SERVER_VARS['REMOTE_ADDR']; } echo $onlineip; ``` 这些代码都是为了确保在各种情况下都能尽可能准确地获取到访客的真实IP。总结来说,获取访客IP地址需综合考虑多种因素,包括直接使用`REMOTE_ADDR`,检查`HTTP_X_FORWARDED_FOR`和`HTTP_CLIENT_IP`,以及在必要时处理可能存在的多级代理。
- 粉丝: 2
- 资源: 917
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 带有边界框的农作物和杂草检测数据 带有 YOLO 和 Pascal 标签的芝麻作物和不同杂草的农业数据
- 练习 JavaScript 的禅宗练习.zip
- 大学生Java二级课程考试
- Nvidia GeForce GT 1030-GeForce Game Ready For Win10&Win11(Win10&Win11 GeForce GT 1030显卡驱动)
- IEC61850仿真模拟器sim860
- 纯 Python Java 解析器和工具.zip
- YOLO标记口罩数据集 (YOLO 格式注释)
- uniapp+vue3+云开发全栈开发同城配送鲜花小程序任意商城教程
- 客户需求快速小程序项目开发技巧
- java项目,课程设计-医疗服务系统.zip