PHP 如何获取客户端ip地址

一、总结

一句话总结:主要是使用$_SERVER的 REMOTE_ADDR 和 HTTP_X_FORWARDED_FOR 两个属性,在用户使用不同代理的时候这两个属性可用于获取ip

使用$_SERVER的 REMOTE_ADDR 和 HTTP_X_FORWARDED_FOR 两个属性
public function ip() {
//strcasecmp 比较两个字符,不区分大小写。返回0,>0,<0。
if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
$ip = getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
$ip = getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
$ip = getenv('REMOTE_ADDR');
} elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
$ip = $_SERVER['REMOTE_ADDR'];
}
$res = preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : '';
echo $res;
//dump(phpinfo());//所有PHP配置信息
}

1、在客户端使用不同代理的时候,$_SERVER的 REMOTE_ADDR 和 HTTP_X_FORWARDED_FOR 两个属性的值分别是什么?

一、如果没有使用代理服务器 REMOTE_ADDR = 客户端IP      HTTP_X_FORWARDED_FOR = 没数值或不显示
二、使用透明代理,REMOTE_ADDR = 最后一个代理服务器 IP    HTTP_X_FORWARDED_FOR = 客户端真实 IP
三、使用普通匿名代理服务器, REMOTE_ADDR = 最后一个代理服务器 IP     HTTP_X_FORWARDED_FOR = 代理服务器 IP
四、使用欺骗性代理服务器, REMOTE_ADDR = 代理服务器 IP    HTTP_X_FORWARDED_FOR = 随机的 IP
五、使用高匿名代理, REMOTE_ADDR = 代理服务器 IP    HTTP_X_FORWARDED_FOR = 没数值或不显示

二、PHP 获取客户端ip地址

参考:PHP 获取客户端ip地址 - 菜乌 - 博客园
https://www.cnblogs.com/rendd/p/6183094.html

一、如果没有使用代理服务器,

  REMOTE_ADDR = 客户端IP    HTTP_X_FORWARDED_FOR = 没数值或不显示

  $ip = $_SERVER['REMOTE_ADDR'];

二、使用透明代理,

  REMOTE_ADDR = 最后一个代理服务器 IP
  HTTP_X_FORWARDED_FOR = 客户端真实 IP (经过多个代理服务器时,这个值类似:221.5.252.160, 203.98.182.163, 203.129.72.215)

  这类代理还会将客户真实ip发送到请求对象,无法隐藏真实ip。

  $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];

三、使用普通匿名代理服务器,

  REMOTE_ADDR = 最后一个代理服务器 IP
  HTTP_X_FORWARDED_FOR = 代理服务器 IP (经过多个代理服务器时,这个值类似:203.98.182.163, 203.98.182.163, 203.129.72.215)

  这样就隐藏了客户端的真实ip,但服务器会知道客户端是通过代理服务器去访问的。

四、使用欺骗性代理服务器,

  REMOTE_ADDR = 代理服务器 IP
  HTTP_X_FORWARDED_FOR = 随机的 IP(经过多个代理服务器时,这个值类似:220.4.251.159, 203.98.182.163, 203.129.72.215)

  服务器可以识别到时通过代理服务器访问的,但发送给目标服务器的是虚假ip。

五、使用高匿名代理,

  REMOTE_ADDR = 代理服务器 IP       HTTP_X_FORWARDED_FOR = 没数值或不显示

  使用这种代理时,不同浏览器不同设备会返回不同的ip头信息,因此PHP使用$_SERVER["REMOTE_ADDR"] 、$_SERVER["HTTP_X_FORWARDED_FOR"] 获取的值可能是空值也可能是“unknown”值。

PHP获取ip代码如下:

public function ip() {
//strcasecmp 比较两个字符,不区分大小写。返回0,>0,<0。
if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
$ip = getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
$ip = getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
$ip = getenv('REMOTE_ADDR');
} elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
$ip = $_SERVER['REMOTE_ADDR'];
}
$res = preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : '';
echo $res;
//dump(phpinfo());//所有PHP配置信息
}
 

PHP 如何获取客户端ip地址的更多相关文章

  1. 在Thinkphp3.2.3框架下实现自动获取客户端IP地址的get_client_ip()函数

    在Thinkphp框架下使用get_client_ip()函数获取客户端IP地址十分方便: 一行代码便可以实现:$ip = get_client_ip(); 但当我们测试时会遇到后台获取的IP地址显示 ...

  2. JAVA获取客户端IP地址

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...

  3. (转)【ASP.NET开发】获取客户端IP地址 via C#

    [ASP.NET开发]获取客户端IP地址 via C# 说明:本文中的内容是我综合博客园上的博文和MSDN讨论区的资料,再通过自己的实际测试而得来,属于自己原创的内容说实话很少,写这一篇是为了记录自己 ...

  4. php获取客户端ip地址

    本文介绍一个,php获取客户端的IP地址的实例代码,有需要的朋友参考下吧. 获取客户端IP地址的代码,如下: 复制代码代码示例: <?php//取得客户端IP的函数function get_cl ...

  5. 获取客户端IP地址 via C#

    获取客户端IP地址 via C# 说明:本文中的内容是我综合博客园上的博文和MSDN讨论区的资料,再通过自己的实际测试而得来,属于自己原创的内容说实话很少,写这一篇是为了记录自己在项目中做过的事情,同 ...

  6. thinkphp 获取客户端ip地址方法

    /** * 获取客户端IP地址 * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字 * @param boolean $adv 是否进行高级模式获取(有 ...

  7. 获取客户端IP地址定位城市信息

    获取客户端IP地址定位城市信息 1.首先获取客户端的IP地址 function getIPaddress(){ $IPaddress=''; if (isset($_SERVER)){ if (iss ...

  8. Tp框架获取客户端IP地址

    /** * 获取客户端IP地址 * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字 * @return mixed */ function get_cl ...

  9. thinkphp之获取客户端IP地址

    /** * 获取客户端IP地址 * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字 * @return mixed */ function get_cl ...

  10. JAVA获取客户端IP地址和MAC地址

    1.获取客户端IP地址 public String getIp(HttpServletRequest request) throws Exception { String ip = request.g ...

随机推荐

  1. goldsun取经----python2与 python3的差异

    python2与 python3的差异 1.编码方式 python2中有ASCII str()类型,unicode是单独的,不是byte类型,不支持中文 python3中有Unicode(utf-8) ...

  2. Python在终端通过pip安装好包以后,在Pycharm中依然无法使用的解决办法

    在终端通过pip装好包以后,在pycharm中导入包时,依然会报错.新手不知道具体原因是什么,我把我的解决过程发出来. pip install 解决方案一: 在Pycharm中,依次打开File--- ...

  3. CSS制作渐变背景色

    <style type="text/css"> #grad1 { background: -webkit-linear-gradient(#C2F2F0,#); /* ...

  4. Java -- 构造函数 & this & 方法重写和方法重载的区别

    JAVA: 今天总结一下构造方法.关键字.方法重载和方法重写的异同   一.构造方法(构造函数)1.构造方法的作用:一是创建对象时调用构造方法创建对象,二是可以初始化多个属性 [学生类创建一个学生对象 ...

  5. Can't locate Params/Validate.pm in @INC (@INC contains: /usr/local/lib64/perl5 /

    今天 安装 MHA,管理节点选 mha4mysql-manager-0.58,在初始化时报错 [root@Server3 ~]# masterha_check_repl  --conf=/etc/ma ...

  6. ametuer technology

    1. eclipse build output/ .s37 not big enough (about 1.23M) Brose Setting: Build command must be BUIL ...

  7. Py 最全的常用正则表达式大全 ZZ

    很多不太懂正则的朋友,在遇到需要用正则校验数据时,往往是在网上去找很久,结果找来的还是不很符合要求.所以我最近把开发中常用的一些正则表达式整理了一下,在这里分享一下.给自己留个底,也给朋友们做个参考. ...

  8. SAP基本计量单位更改(转载)

    转载自:http://blog.csdn.net/sapmatinal/article/details/50997819 在SAP中物料创建后,一旦发生业务,其基本计量单位便很难修改.由于单位无法满足 ...

  9. python多态和规范

    python规范(接口类) 接口类可以规范代码,但接口类本身是不实现的 class Payment: def pay(self,money): raise Notlmplemented class W ...

  10. centos设置网卡开机自启动

    1.进入目录/etc/sysconfig/network-scripts/2.修改ifcfg-enxxxxxxxx 文件   (即你的网卡标识命名的配置文件)3. 将ONBOOT=no改成yes4. ...