通过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动态创建Flash动画
Oct 09 PHP
PHP中常用数组处理方法实例分析
Aug 30 PHP
PHP 文件上传源码分析(RFC1867)
Oct 30 PHP
PHP array_multisort()函数的使用札记
Jul 03 PHP
php数组函数序列之in_array() - 查找数组中是否存在指定值
Nov 07 PHP
php中heredoc与nowdoc介绍
Dec 25 PHP
php中的观察者模式简单实例
Jan 20 PHP
php实现比较两个文件夹异同的方法
Jun 18 PHP
WordPress中限制非管理员用户在文章后只能评论一次
Dec 31 PHP
Zend Framework缓存Cache用法简单实例
Mar 19 PHP
Zend Framework入门教程之Zend_Config组件用法详解
Dec 09 PHP
PHP+MySQL高并发加锁事务处理问题解决方法
Apr 30 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
优化使用mysql存储session的php代码
2008/01/10 PHP
探讨:parse url解析URL,返回其组成部分
2013/06/14 PHP
脚本安需导入(装载)的三种模式的对比
2007/06/24 Javascript
js实现n秒倒计时后才可以点击的效果
2015/12/20 Javascript
jQuery实现获取table表格第一列值的方法
2016/03/01 Javascript
Bootstrap和Angularjs配合自制弹框的实例代码
2016/08/24 Javascript
JavaScript表单验证的两种实现方法
2017/02/11 Javascript
JS实现匀加速与匀减速运动的方法示例
2017/09/04 Javascript
详解NodeJs开发微信公众号
2018/05/25 NodeJs
详解微信小程序中组件通讯
2018/10/30 Javascript
从零到一详聊创建Vue工程及遇到的常见问题
2019/04/25 Javascript
vue-router的钩子函数用法实例分析
2019/10/26 Javascript
[03:31]DOTA2英雄基础教程 大地之灵
2013/12/17 DOTA
[45:16]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第一场 12.12
2020/12/16 DOTA
Python根据区号生成手机号码的方法
2015/07/08 Python
python搭建虚拟环境的步骤详解
2016/09/27 Python
Python进阶_关于命名空间与作用域(详解)
2017/05/29 Python
详解Python 正则表达式模块
2018/11/05 Python
在python中按照特定顺序访问字典的方法详解
2018/12/14 Python
python django框架中使用FastDFS分布式文件系统的安装方法
2019/06/10 Python
Python实现的企业粉丝抽奖功能示例
2019/07/26 Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
2020/03/23 Python
Python多线程Threading、子线程与守护线程实例详解
2020/03/24 Python
python argparse传入布尔参数false不生效的解决
2020/04/20 Python
python基于win32api实现键盘输入
2020/12/09 Python
Python调用系统命令os.system()和os.popen()的实现
2020/12/31 Python
如何用 Python 制作一个迷宫游戏
2021/02/25 Python
西班牙网上书店:Casa del Libro
2016/11/01 全球购物
请介绍一下WSDL的文档结构
2013/03/17 面试题
寄语十八大感言
2014/02/07 职场文书
食品流通安全承诺书
2014/05/22 职场文书
幼儿教师求职信
2014/05/24 职场文书
服装设计专业自荐信
2014/06/17 职场文书
个人工作表现评价材料
2014/09/21 职场文书
goland 设置project gopath的操作
2021/05/06 Golang
SQL IDENTITY_INSERT作用案例详解
2021/08/23 MySQL