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 相关文章推荐
php4的彩蛋
Oct 09 PHP
计算一段日期内的周末天数的php代码(星期六,星期日总和)
Nov 12 PHP
解析dedecms空间迁移步骤详解
May 15 PHP
php命名空间学习详解
Feb 27 PHP
php获取目标函数执行时间示例
Mar 04 PHP
php提示Failed to write session data错误的解决方法
Dec 17 PHP
将FCKeditor导入PHP+SMARTY的实现方法
Jan 15 PHP
PHP递归创建多级目录
Nov 05 PHP
php删除数组中重复元素的方法
Dec 22 PHP
PHP5.2中PDO的简单使用方法
Mar 25 PHP
thinkPHP简单实现多个子查询语句的方法
Dec 05 PHP
详解PHP使用Redis存储session时的一个Warning定位
Jul 05 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中空字符串介绍0、null、empty和false之间的关系
2012/09/25 PHP
PHP设计模式之调解者模式的深入解析
2013/06/13 PHP
Yii核心组件AssetManager原理分析
2014/12/02 PHP
PHP实现腾讯与百度坐标转换
2017/08/05 PHP
PHP 实现公历日期与农历日期的互转换
2017/09/13 PHP
Laravel如何同时连接多个数据库详解
2019/08/13 PHP
jQuery boxy弹出层插件中文演示及使用讲解
2011/02/24 Javascript
Jquery右下角抖动、浮动 实例代码(兼容ie6、FF)
2013/08/15 Javascript
extjs 时间范围选择自动判断的实现代码
2014/06/24 Javascript
Javascript基础知识(三)BOM,DOM总结
2014/09/29 Javascript
jquery实现在网页指定区域显示自定义右键菜单效果
2015/08/25 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
2016/05/24 Javascript
设置jQueryUI DatePicker默认语言为中文
2016/06/04 Javascript
详解Vue.js——60分钟组件快速入门(上篇)
2016/12/05 Javascript
layui前段框架日期控件使用方法详解
2017/05/19 Javascript
最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等
2017/08/16 Javascript
详解Chai.js断言库API中文文档
2018/01/31 Javascript
Vue动态控制input的disabled属性的方法
2018/06/26 Javascript
Vue动态生成表格的行和列
2019/07/18 Javascript
微信小程序new Date()方法失效问题解决方法
2019/07/29 Javascript
Vue form表单动态添加组件实战案例
2019/09/02 Javascript
Vue封装Axios请求和拦截器的步骤
2020/09/16 Javascript
python django 访问静态文件出现404或500错误
2017/01/20 Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
2018/07/07 Python
基于pytorch padding=SAME的解决方式
2020/02/18 Python
Python request操作步骤及代码实例
2020/04/13 Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
2020/11/28 Python
css3实现图片遮罩效果鼠标hover以后出现文字
2013/11/05 HTML / CSS
英国领先的奢侈品零售商之一:CRUISE
2016/12/02 全球购物
大韩航空官方网站:Korean Air
2017/10/25 全球购物
GWT的应用有哪两种部署模式
2012/12/21 面试题
外贸销售员求职的自我评价
2013/11/23 职场文书
小学生环保标语
2014/06/13 职场文书
课外访万家心得体会
2014/09/03 职场文书
警示教育片观后感
2015/06/17 职场文书
网吧管理制度范本
2015/08/05 职场文书