通过PHP实现获取访问用户IP


Posted in PHP onMay 09, 2020

在php中自带了一个非常的简单的获取IP地址的全局变量,很多初学都获取IP都使用它了,但是对于这些我们一般用法是满足了,但是对于要求高精度这个函数还是不行的。

这个是最简单的方法,对于开了透明代理之类的是没有办法的,如果内网访问也不能读取正确的外网IP,不过很省力就是了:

$ip = $_SERVER["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地址,根据经验得出

function getIP()
{
  static $realip;
  if (isset($_SERVER)){
    if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])){
      $realip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    } else if (isset($_SERVER["HTTP_CLIENT_IP"])) {
      $realip = $_SERVER["HTTP_CLIENT_IP"];
    } else {
      $realip = $_SERVER["REMOTE_ADDR"];
    }
  } else {
    if (getenv("HTTP_X_FORWARDED_FOR")){
      $realip = getenv("HTTP_X_FORWARDED_FOR");
    } else if (getenv("HTTP_CLIENT_IP")) {
      $realip = getenv("HTTP_CLIENT_IP");
    } else {
      $realip = getenv("REMOTE_ADDR");
    } 
  }
  return $realip;
}

另外如果我们想获取更精准的使用第三方是一个不错的方法哦

function get_onlineip() {
  $ch = curl_init('http://www.ip138.com/ip2city.asp');
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  $a = curl_exec($ch);
  preg_match('/[(.*)]/', $a, $ip);
  return $ip[1];
 }

这样不管理代理还是什么都可以判断IP地址哦

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
浅谈PHP语法(1)
Oct 09 PHP
php开发工具之vs2005图解
Jan 12 PHP
mysql5的sql文件导入到mysql4的方法
Oct 19 PHP
php 求质素(素数) 的实现代码
Apr 12 PHP
PHP include_path设置技巧分享
Jul 03 PHP
PHP采集腾讯微博的实现代码
Jan 19 PHP
php中使用cookie来保存用户登录信息的实现代码
Mar 08 PHP
php中存储用户ID和密码到mysql数据库的方法
Feb 06 PHP
ThinkPHP关于session的操作方法汇总
Jul 18 PHP
详解Yii实现分页的两种方法
Jan 14 PHP
利用PHPExcel读取Excel的数据和导出数据到Excel
May 12 PHP
PHP设计模式之建造者模式(Builder)原理与用法案例详解
Dec 12 PHP
如何通过PHP实现Des加密算法代码实例
May 09 #PHP
php变量与字符串的增删改查操作示例
May 07 #PHP
PHP数组与字符串互相转换实例
May 05 #PHP
禁止直接访问php文件代码分享
May 05 #PHP
php将字符串转换为数组实例讲解
May 05 #PHP
php输出形式实例整理
May 05 #PHP
PHP设计模式(九)外观模式Facade实例详解【结构型】
May 02 #PHP
You might like
用Socket发送电子邮件
2006/10/09 PHP
PHP数组函数知识汇总
2016/05/12 PHP
Linux下快速搭建php开发环境
2017/03/13 PHP
Code:loadScript( )加载js的功能函数
2007/02/02 Javascript
一个加载js文件的小脚本
2007/06/28 Javascript
动态的改变IFrame的高度实现IFrame自动伸展适应高度
2012/12/28 Javascript
jQuery切换网页皮肤并保存到Cookie示例代码
2014/06/16 Javascript
JQuery中层次选择器用法实例详解
2015/05/18 Javascript
JavaScript中用toString()方法返回时间为字符串
2015/06/12 Javascript
JavaScript用构造函数如何获取变量的类型名
2016/12/23 Javascript
vue脚手架vue-cli的学习使用教程
2017/06/06 Javascript
JavaScript用200行代码制作打飞机小游戏实例
2017/06/21 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
详解JavaScript事件循环机制
2018/09/07 Javascript
vue代码分割的实现(codesplit)
2018/11/13 Javascript
jQuery时间戳和日期相互转换操作示例
2018/12/07 jQuery
vue favicon设置以及动态修改favicon的方法
2018/12/21 Javascript
jQuery实现侧边栏隐藏与显示的方法详解
2018/12/22 jQuery
jquery实现简单拖拽效果
2020/07/20 jQuery
JavaScript 事件代理需要注意的地方
2020/09/08 Javascript
[01:30:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第二场 2月2日
2021/03/11 DOTA
菜鸟使用python实现正则检测密码合法性
2016/01/05 Python
django queryset相加和筛选教程
2020/05/18 Python
Python+unittest+requests 接口自动化测试框架搭建教程
2020/10/09 Python
OnePlus加拿大官网:中国国际化手机品牌
2020/10/13 全球购物
2019年c语言经典面试题目
2016/08/17 面试题
我的网上商城创业计划书
2013/12/26 职场文书
安全生产实施方案
2014/02/23 职场文书
我读书我快乐演讲稿
2014/05/07 职场文书
普通话演讲稿
2014/09/03 职场文书
商务司机岗位职责
2015/04/10 职场文书
入党介绍人意见2015
2015/06/01 职场文书
公司开业致辞
2015/07/29 职场文书
聘用合同范本
2015/09/21 职场文书
导游经典开场白——导游词
2019/04/17 职场文书
Python中的np.argmin()和np.argmax()函数用法
2021/06/02 Python