通过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 相关文章推荐
Smarty Foreach 使用说明
Mar 23 PHP
ajax+php打造进度条代码[readyState各状态说明]
Apr 12 PHP
解析PHP中一些可能会被忽略的问题
Jun 21 PHP
使用ThinkPHP+Uploadify实现图片上传功能
Jun 26 PHP
php实现搜索一维数组元素并删除二维数组对应元素的方法
Jul 06 PHP
SESSION存放在数据库用法实例
Aug 08 PHP
php搜索文件程序分享
Oct 30 PHP
PHP设置Cookie的HTTPONLY属性方法
Feb 09 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
Aug 07 PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 PHP
php微信开发之谷歌测距
Jun 14 PHP
实现PHP中session存储及删除变量
Oct 15 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
ThinkPHP控制器里javascript代码不能执行的解决方法
2014/11/22 PHP
Codeigniter发送邮件的方法
2015/03/19 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
2015/04/15 PHP
PHP实现路由映射到指定控制器
2016/08/13 PHP
WAF的正确bypass
2017/01/05 PHP
php封装的pdo数据库操作工具类与用法示例
2019/05/08 PHP
探讨JavaScript中声明全局变量三种方式的异同
2013/12/03 Javascript
JS获取几种URL地址的方法小结
2014/02/26 Javascript
jquery中show()、hide()和toggle()用法实例
2015/01/15 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
nodejs中实现阻塞实例
2015/03/24 NodeJs
学习Javascript闭包(Closure)知识
2016/08/07 Javascript
Js获取当前日期时间及格式化代码
2016/09/17 Javascript
关于TypeScript模块导入的那些事
2018/06/12 Javascript
js实现黑白div块画空心的图形
2018/12/13 Javascript
python 中random模块的常用方法总结
2017/07/08 Python
JSONLINT:python的json数据验证库实例解析
2017/11/28 Python
Python实现PS图像调整之对比度调整功能示例
2018/01/26 Python
谈谈python中GUI的选择
2018/03/01 Python
python 爬虫 批量获取代理ip的实例代码
2018/05/22 Python
python中退出多层循环的方法
2018/11/27 Python
python的set处理二维数组转一维数组的方法示例
2019/05/31 Python
关于Tensorflow分布式并行策略
2020/02/03 Python
python numpy--数组的组合和分割实例
2020/02/24 Python
解决keras加入lambda层时shape的问题
2020/06/11 Python
python使用多线程查询数据库的实现示例
2020/08/17 Python
Born鞋子官网:Born Shoes
2017/04/06 全球购物
SCDKey德国:全球领先的数字游戏市场
2019/04/09 全球购物
单位介绍信范文
2014/01/18 职场文书
公司寄语大全
2014/04/10 职场文书
饭店服务员岗位职责
2015/02/09 职场文书
2015年超市收银员工作总结
2015/04/25 职场文书
校园广播站开场白
2015/06/01 职场文书
2015年电气技术员工作总结
2015/07/24 职场文书
读《儒林外史》有感:少一些功利,多一些真诚
2020/01/19 职场文书
详解JVM系列之内存模型
2021/06/10 Javascript