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 相关文章推荐
PHPwind整合最土系统用户同步登录实现方法
Dec 08 PHP
php+ajax做仿百度搜索下拉自动提示框(有实例)
Aug 21 PHP
基于xcache的配置与使用详解
Jun 18 PHP
linux中cd命令使用详解
Jan 08 PHP
PHP文件缓存类示例分享
Jan 30 PHP
在html文件中也可以执行php语句的方法
Apr 09 PHP
php通过排列组合实现1到9数字相加都等于20的方法
Aug 03 PHP
php语言中使用json的技巧及json的实现代码详解
Oct 27 PHP
PHP实现JS中escape与unescape的方法
Jul 11 PHP
php中实现进程锁与多进程的方法
Sep 18 PHP
解决windows上php xdebug 无法调试的问题
Feb 19 PHP
phpstorm最新激活码分享亲测phpstorm2020.2.3版可用
Nov 22 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 获取一个月第一天与最后一天的代码
2010/05/16 PHP
php中3种方法删除字符串中间的空格
2014/03/10 PHP
CodeIgniter框架提示Disallowed Key Characters的解决办法
2014/04/21 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
php实现的表单验证类完整示例
2019/08/13 PHP
Opacity.js
2007/01/22 Javascript
关于JQuery($.load)事件的用法和分析
2013/04/09 Javascript
动态加载jquery库的方法
2014/02/12 Javascript
JavaScript判断是否为数组的3种方法及效率比较
2015/04/01 Javascript
javascript实现youku的视频代码自适应宽度
2015/05/25 Javascript
基于jQuery的checkbox全选问题分析
2016/11/18 Javascript
Angularjs之如何在跨域请求中传输Cookie的方法
2018/06/01 Javascript
vue2.0的虚拟DOM渲染思路分析
2018/08/09 Javascript
vue2过滤器模糊查询方法
2018/09/16 Javascript
基于Nodejs的Tcp封包和解包的理解
2018/09/19 NodeJs
Vue2(三)实现子菜单展开收缩,带动画效果实现方法
2019/04/28 Javascript
JS学习笔记之贪吃蛇小游戏demo实例详解
2019/05/29 Javascript
微信小程序的授权实现过程解析
2019/08/02 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
[41:20]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS DK
2014/05/26 DOTA
Linux下将Python的Django项目部署到Apache服务器
2015/12/24 Python
python进程管理工具supervisor的安装与使用教程
2017/09/05 Python
Python基于socket模块实现UDP通信功能示例
2018/04/10 Python
python 中的paramiko模块简介及安装过程
2020/02/29 Python
浅析rem和em和px vh vw和% 移动端长度单位
2016/04/28 HTML / CSS
css3实现简单的白云飘动背景特效
2020/10/28 HTML / CSS
AmazeUI 折叠面板的实现代码
2020/08/17 HTML / CSS
台湾专柜女包:KINAZ
2019/12/26 全球购物
公务员总结性个人自我评价
2013/12/05 职场文书
班主任新年寄语
2014/04/04 职场文书
农行心得体会
2014/09/02 职场文书
2014年信息宣传工作总结
2014/12/18 职场文书
舌尖上的中国观后感
2015/06/02 职场文书
公司车队管理制度
2015/08/04 职场文书
家庭教育教师培训学习体会
2016/01/14 职场文书
Python+Selenium实现读取网易邮箱验证码
2022/03/13 Python