通过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 相关文章推荐
IIS+PHP+MySQL+Zend配置 (视频教程)
Dec 13 PHP
实用函数5
Nov 08 PHP
PHP 处理图片的类实现代码
Oct 23 PHP
PHP中用正则表达式清除字符串的空白
Jan 17 PHP
CodeIgniter读写分离实现方法详解
Jan 20 PHP
Zend Framework生成验证码并实现验证码验证功能(附demo源码下载)
Mar 22 PHP
验证坐标在某坐标区域内php代码
Oct 08 PHP
PHP编程中的Session阻塞问题与解决方法分析
Aug 07 PHP
THINKPHP3.2使用soap连接webservice的解决方法
Dec 13 PHP
PHP使用file_get_contents发送http请求功能简单示例
Apr 29 PHP
php压缩文件夹最新版
Jul 18 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
Feb 21 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
php MYSQL 数据备份类
2009/06/19 PHP
PHP输出英文时间日期的安全方法(RFC 1123格式)
2014/06/13 PHP
PHP函数shuffle()取数组若干个随机元素的方法分析
2016/04/02 PHP
将PHP的session数据存储到数据库中的代码实例
2016/06/24 PHP
PHP 获取指定地区的天气实例代码
2017/02/08 PHP
PHP ajax+jQuery 实现批量删除功能实例代码小结
2018/12/06 PHP
PHP递归统计系统中代码行数
2019/09/19 PHP
jQuery 学习第五课 Ajax 使用说明
2010/05/17 Javascript
javascript自执行函数之伪命名空间封装法
2010/12/25 Javascript
Js-$.extend扩展方法使方法参数更灵活
2013/01/15 Javascript
javascript 小数取整简单实现方式
2014/05/30 Javascript
javascript setinterval 的正确语法如何书写
2014/06/17 Javascript
关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
2015/10/12 Javascript
《JavaScript高级编程》学习笔记之object和array引用类型
2015/11/01 Javascript
jquery实现网站列表切换效果的2种方法
2016/08/12 Javascript
Vue表单验证插件Vue Validator使用方法详解
2017/04/07 Javascript
Mac下通过brew安装指定版本的nodejs教程
2018/05/17 NodeJs
详解微信小程序input标签正则初体验
2018/08/18 Javascript
NodeJS有难度的面试题(能答对几个)
2019/10/09 NodeJs
layui form表单提交后实现自动刷新
2019/10/25 Javascript
JavaScript单线程和任务队列原理解析
2020/02/04 Javascript
uni-app使用countdown插件实现倒计时
2020/11/01 Javascript
[04:37]DOTA2英雄梦之声Vol20发条
2014/06/20 DOTA
Python中使用PIL库实现图片高斯模糊实例
2015/02/08 Python
Python找出文件中使用率最高的汉字实例详解
2015/06/03 Python
python中使用序列的方法
2015/08/03 Python
我用Python抓取了7000 多本电子书案例详解
2019/03/25 Python
pytorch 中的重要模块化接口nn.Module的使用
2020/04/02 Python
浅谈pycharm导入pandas包遇到的问题及解决
2020/06/01 Python
python实现感知机模型的示例
2020/09/30 Python
Python排序函数的使用方法详解
2020/12/11 Python
兼职学生的自我评价
2013/11/24 职场文书
公司授权委托书范本
2014/04/03 职场文书
2015年党员承诺书
2015/01/21 职场文书
致三级跳运动员加油稿
2015/07/21 职场文书
Python绘制地图神器folium的新人入门指南
2021/05/23 Python