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 什么是PEAR?(第二篇)
Mar 19 PHP
PHP 生成的XML以FLASH获取为乱码终极解决
Aug 07 PHP
PHP 身份验证方面的函数
Oct 11 PHP
PHP类继承 extends使用介绍
Jan 14 PHP
修改destoon会员公司的伪静态中的com目录的方法
Aug 21 PHP
php+ajax实现无刷新的新闻留言系统
Dec 21 PHP
java模拟PHP的pack和unpack类
Apr 13 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
Mar 06 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
Mar 02 PHP
php5.5使用PHPMailer-5.2发送邮件的完整步骤
Oct 14 PHP
php源码的安装方法和实例
Sep 26 PHP
Laravel 实现添加多语言提示信息
Oct 25 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
smarty的保留变量问题
2008/10/23 PHP
PHP中的strtr函数使用介绍(str_replace)
2011/10/20 PHP
ThinkPHP中的系统常量和预定义常量集合
2014/07/01 PHP
php将日期格式转换成xx天前的格式
2015/04/16 PHP
php表单文件iframe异步上传实例讲解
2017/07/26 PHP
PHP正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
javascript for循环从入门到偏门(效率优化+奇特用法)
2012/08/01 Javascript
JavaScript实现select添加option
2015/07/03 Javascript
javascript 中的 delete及delete运算符
2015/11/15 Javascript
一不小心就做错的JS闭包面试题
2015/11/25 Javascript
jQuery1.9+中删除了live以后的替代方法
2016/06/17 Javascript
JS实现的打字机效果完整实例
2016/06/20 Javascript
node.js发送邮件email的方法详解
2017/01/06 Javascript
用vuex写了一个购物车H5页面的示例代码
2018/12/04 Javascript
[04:37]DOTA2英雄梦之声Vol20发条
2014/06/20 DOTA
[44:15]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第二局
2016/03/06 DOTA
[02:16]2018年度CS GO最具人气选手-完美盛典
2018/12/16 DOTA
Python中使用PDB库调试程序
2015/04/05 Python
python&amp;MongoDB爬取图书馆借阅记录
2016/02/05 Python
Python登录并获取CSDN博客所有文章列表代码实例
2017/12/28 Python
pandas apply 函数 实现多进程的示例讲解
2018/04/20 Python
Python函数中不定长参数的写法
2019/02/13 Python
python数据归一化及三种方法详解
2019/08/06 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
2019/11/19 Python
Python如何定义有默认参数的函数
2020/08/10 Python
python 爬虫如何实现百度翻译
2020/11/16 Python
房务中心文员岗位职责
2014/04/16 职场文书
民事诉讼代理委托书
2014/10/08 职场文书
故意伤害人身损害赔偿协议书
2014/11/19 职场文书
师德师风事迹材料
2014/12/20 职场文书
世界红十字日活动总结
2015/02/10 职场文书
中学生清明节演讲稿
2015/03/18 职场文书
2015年护士节活动策划方案
2015/05/04 职场文书
高二数学教学反思
2016/02/18 职场文书
golang fmt格式“占位符”的实例用法详解
2021/07/04 Golang
详解Spring Bean的配置方式与实例化
2022/06/10 Java/Android