php获得用户ip地址的比较不错的方法


Posted in PHP onFebruary 08, 2014

REMOTE_ADDR只能获取访问者本地连接中设置的IP,如某大学校园网中自己设置的10.X.XXX.XXX系列IP,而这个函数获取的是局域网网关出口的IP地址,如果访问者使用代理服务器,将不获取代理服务器的IP,而是获取访问者网关的真实IP。如果将这个函数应用到限IP访问的网页中,别人即使通过限IP访问段中的代理服务器,也不能访问该页面。

下面提供一个函数:

<?php // 定义一个函数getIP() 
function getIP() 
{ 
global $ip; 
if (getenv("HTTP_CLIENT_IP")) 
$ip = getenv("HTTP_CLIENT_IP"); 
else if(getenv("HTTP_X_FORWARDED_FOR")) 
$ip = getenv("HTTP_X_FORWARDED_FOR"); 
else if(getenv("REMOTE_ADDR")) 
$ip = getenv("REMOTE_ADDR"); 
else 
$ip = "Unknow"; 
return $ip; 
} 
// 使用方法: 
echo getIP(); 
?>

getenv("REMOTE_ADDR")用来取得客户端的 IP 地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的 IP 地址,而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址,就要使用 getenv("HTTP_X_FORWARDED_FOR") 来读取。

但是如果客户端没有通过代理服务器来访问,那么用getenv("HTTP_X_FORWARDED_FOR") 取到的值将是空的。

else if(getenv("HTTP_X_FORWARDED_FOR")) 
$ip = getenv("HTTP_X_FORWARDED_FOR");

表示如果getenv("HTTP_X_FORWARDED_FOR") 取到的值存在不为空(即客户端使用代理服务器的情况下),则变量$ip等于getenv("HTTP_X_FORWARDED_FOR") 取到的真实IP值。

如果上面的else if(getenv("HTTP_X_FORWARDED_FOR"))取得的值为空(即没有使用代理服务器),则不会执行下面的$ip = getenv("HTTP_X_FORWARDED_FOR");这一行语句。

这种情况下已经确认客户端没有使用代理服务器,从而通过

else if(getenv("REMOTE_ADDR")) 
$ip = getenv("REMOTE_ADDR");

这两行语句获得客户端的IP地址也是真实的IP地址。
PHP 相关文章推荐
PHP个人网站架设连环讲(四)
Oct 09 PHP
PHP生成静态页
Nov 25 PHP
php学习笔记之 函数声明(二)
Jun 09 PHP
PHP函数eval()介绍和使用示例
Aug 20 PHP
ThinkPHP采用原生query实现关联查询left join实例
Dec 02 PHP
使用纯php代码实现页面伪静态的方法
Jul 25 PHP
windows server 2008/2012安装php iis7 mysql环境搭建教程
Jun 30 PHP
laravel创建类似ThinPHP中functions.php的全局函数
Nov 26 PHP
PHP基于DOMDocument解析和生成xml的方法分析
Jul 17 PHP
深入理解 PHP7 中全新的 zval 容器和引用计数机制
Oct 15 PHP
php+js实现裁剪任意形状图片
Oct 31 PHP
因str_replace导致的注入问题总结
Aug 08 PHP
php全角字符转换为半角函数
Feb 07 #PHP
二进制交叉权限微型php类分享
Feb 07 #PHP
php stripslashes和addslashes的区别
Feb 03 #PHP
php获取网页标题和内容函数(不包含html标签)
Feb 03 #PHP
PHP下获取上个月、下个月、本月的日期(strtotime,date)
Feb 02 #PHP
采用header定义为文件然后readfile下载(隐藏下载地址)
Jan 31 #PHP
分享一个超好用的php header下载函数
Jan 31 #PHP
You might like
PHP防止post重复提交数据的简单例子
2014/06/07 PHP
PHP实现批量修改文件后缀名的方法
2015/07/30 PHP
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
2016/07/25 PHP
简单谈谈PHP中的Reload操作
2016/12/12 PHP
用Laravel Sms实现laravel短信验证码的发送的实现
2018/11/29 PHP
两个DIV等高的JS的实现代码
2007/12/23 Javascript
JQuery以JSON方式提交数据到服务端示例代码
2014/05/05 Javascript
js获取当前时间显示在页面上并每秒刷新
2014/12/24 Javascript
JavaScript操作HTML元素和样式的方法详解
2015/10/21 Javascript
3种js实现string的substring方法
2015/11/09 Javascript
基于JavaScript实现弹出框效果
2016/02/19 Javascript
JS中的eval 为什么加括号
2016/04/13 Javascript
全面理解JavaScript中的继承(必看)
2016/06/16 Javascript
Webpack如何引入bootstrap的方法
2017/06/17 Javascript
Vue项目安装插件并保存
2019/01/28 Javascript
微信小程序实现联动选择器
2019/02/15 Javascript
Vue实现滑动拼图验证码功能
2019/09/15 Javascript
如何在Vue中使localStorage具有响应式(思想实验)
2020/07/14 Javascript
理解JavaScript中的Proxy 与 Reflection API
2020/09/21 Javascript
深入源码解析Python中的对象与类型
2015/12/11 Python
django1.8使用表单上传文件的实现方法
2016/11/04 Python
python顺序的读取文件夹下名称有序的文件方法
2018/07/11 Python
Python基于递归算法求最小公倍数和最大公约数示例
2018/07/27 Python
Python for循环与range函数的使用详解
2019/03/23 Python
flask框架蓝图和子域名配置详解
2020/01/25 Python
德国箱包网上商店:koffer24.de
2016/07/27 全球购物
Agoda香港:全球特价酒店预订
2017/05/07 全球购物
Sephora丝芙兰泰国官方网站:国际知名化妆品购物
2017/11/15 全球购物
材料化学应届生求职信
2013/10/09 职场文书
中学生社会实践活动总结
2014/07/03 职场文书
团员自我评价范文
2015/03/10 职场文书
2015年社区综治工作总结
2015/04/21 职场文书
公司员工奖惩制度
2015/08/04 职场文书
详解在SQLPlus中实现上下键翻查历史命令的功能
2022/03/18 SQL Server
PYTHON InceptionV3模型的复现详解
2022/05/06 Python
一次SQL查询优化原理分析(900W+数据从17s到300ms)
2022/06/10 SQL Server