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 相关文章推荐
如何开发一个虚拟域名系统
Oct 09 PHP
PHP 选项及相关信息函数库
Dec 04 PHP
PR值查询 | PageRank 查询
Dec 20 PHP
解析PHP处理换行符的问题 \r\n
Jun 13 PHP
php实现mysql数据库操作类分享
Feb 14 PHP
PHP简单实现“相关文章推荐”功能的方法
Jul 19 PHP
javascript+php实现根据用户时区显示当地时间的方法
Mar 11 PHP
PHP邮箱验证示例教程
Jun 01 PHP
php使用str_shuffle()函数生成随机字符串的方法分析
Feb 17 PHP
php实现数据库的增删改查
Feb 26 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
Jul 07 PHP
laravel批量生成假数据的方法
Oct 09 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删除指定目录中的所有目录及文件的方法
2015/02/26 PHP
php中mysql操作buffer用法详解
2015/03/19 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
2016/08/01 PHP
PHP错误处理函数register_shutdown_function使用示例
2017/07/03 PHP
javascript 面向对象全新理练之原型继承
2009/12/03 Javascript
JavaScript prototype对象的属性说明
2010/03/13 Javascript
FileUpload 控件 禁止手动输入或粘贴的实现代码
2010/04/07 Javascript
简单实用的js调试logger组件实现代码
2010/11/20 Javascript
浅析jQuery(function(){})与(function(){})(jQuery)之间的区别
2014/01/09 Javascript
JavaScript插件化开发教程 (二)
2015/01/27 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
2015/08/06 Javascript
APP中javascript+css3实现下拉刷新效果
2016/01/27 Javascript
多功能jQuery树插件zTree实现权限列表简单实例
2016/07/12 Javascript
基于JS实现checkbox全选功能实例代码
2016/10/31 Javascript
React Native预设占位placeholder的使用
2017/09/28 Javascript
解决在Bootstrap模糊框中使用WebUploader的问题
2018/03/22 Javascript
小程序实现多个选项卡切换
2020/06/19 Javascript
vue实现顶部菜单栏
2020/11/08 Javascript
[01:06:42]VP vs NewBee Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
Python笔记(叁)继续学习
2012/10/24 Python
python调用java模块SmartXLS和jpype修改excel文件的方法
2015/04/28 Python
如何利用Fabric自动化你的任务
2016/10/20 Python
基于h5py的使用及数据封装代码
2019/12/26 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
2020/04/08 Python
Python基于codecs模块实现文件读写案例解析
2020/05/11 Python
用python实现名片管理系统
2020/06/18 Python
浅谈HTML5 Web Worker的使用
2018/01/05 HTML / CSS
美国复古街头服饰精品店:Need Supply Co.
2017/02/22 全球购物
环境科学专业优秀毕业生自荐书
2014/02/03 职场文书
电话客服工作职责
2014/07/27 职场文书
银行奉献演讲稿
2014/09/16 职场文书
医院反腐倡廉演讲稿
2014/09/16 职场文书
服务明星事迹材料
2014/12/29 职场文书
2015年司法所工作总结
2015/04/27 职场文书
汤姆叔叔的小屋读书笔记
2015/06/30 职场文书
关于Vue Router的10条高级技巧总结
2021/05/06 Vue.js