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小偷的核心程序
Apr 09 PHP
浅析PHP中的UNICODE 编码与解码
Jun 29 PHP
用Zend Studio+PHPnow+Zend Debugger搭建PHP服务器调试环境步骤
Jan 19 PHP
php查询whois信息的方法
Jun 08 PHP
PHP搭建大文件切割分块上传功能示例
Jan 04 PHP
PHP 配置后台登录以及模板引入
Jan 24 PHP
PHP实现的Redis多库选择功能单例类
Jul 27 PHP
php连接MSsql server的五种方法总结
Mar 04 PHP
PHP设计模式之简单工厂和工厂模式实例分析
Mar 25 PHP
PHP下载文件函数与用法示例
Sep 27 PHP
laravel 解决路由除了根目录其他都404的问题
Oct 18 PHP
PHP生成图表pChart的示例解析
Jul 31 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生成txt文件标题及内容的方法
2014/01/16 PHP
php中随机函数mt_rand()与rand()性能对比分析
2014/12/01 PHP
在WordPress的后台中添加顶级菜单和子菜单的函数详解
2016/01/11 PHP
thinkPHP内置字符串截取函数用法详解
2016/11/15 PHP
php图形jpgraph操作实例分析
2017/02/22 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
2018/10/18 PHP
php把文件设置为插件的技巧方法
2020/02/03 PHP
textarea的value是html文件源代码,存成html文件的代码
2007/04/20 Javascript
JQuery 解析多维的Json数据格式
2009/11/02 Javascript
JavaScript中for..in循环陷阱介绍
2013/11/12 Javascript
JavaScript中Number.NEGATIVE_INFINITY值的使用详解
2015/06/05 Javascript
js实现图片点击左右轮播
2015/07/08 Javascript
Jquery轮播效果实现过程解析
2016/03/30 Javascript
Vue.js每天必学之方法与事件处理器
2016/09/06 Javascript
js闭包用法实例详解
2016/12/13 Javascript
Javascript格式化并高亮xml字符串的方法及注意事项
2018/08/13 Javascript
详解解决Vue相同路由参数不同不会刷新的问题
2018/10/12 Javascript
微信浏览器下拉黑边解决方案 wScroollFix
2020/01/21 Javascript
react 原生实现头像滚动播放的示例
2020/04/21 Javascript
nodejs各种姿势断点调试的方法
2020/06/18 NodeJs
JavaScript实现单点登录的示例
2020/09/23 Javascript
Vue双向数据绑定(MVVM)的原理
2020/10/03 Javascript
下载糗事百科的内容_python版
2008/12/07 Python
微信跳一跳游戏python脚本
2020/04/01 Python
如何基于python操作json文件获取内容
2019/12/24 Python
学习Python爬虫的几点建议
2020/08/05 Python
Lampenwelt德国:欧洲领先的灯具和照明在线商店
2018/08/05 全球购物
应届行政管理专业个人自我评价
2013/12/28 职场文书
电子信息工程专业推荐信
2014/02/14 职场文书
秸秆管理实施方案
2014/03/15 职场文书
婚前协议书怎么写
2014/04/15 职场文书
大学生第一学年自我鉴定2015
2014/09/28 职场文书
2015年妇女工作总结
2015/05/14 职场文书
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/07 PostgreSQL
如何通过cmd 连接阿里云服务器
2022/04/18 Servers
Windows Server 2016 配置 IIS 的详细步骤
2022/04/28 Servers