PHP获取客户端IP的方法

xiaohai 2019-07-14 17:19:13 2277人围观 标签: PHP 
简介在使用Laravel获取客户端IP的时候出现了这样一种常见,我们通过阿里云ECS部署的代码,但是前面通过阿里云的LSB(负载均衡)。所以每次通过Laravel自带的函数去获取IP的时候,总是不能获取到真实的客户端IP。所以这里主要记录下获取真实客户端IP的方法。
获取客户端IP的原理
  1. HTTP_X_FORWARDED_FOR 是用户到达最终访问地时经过的路径访问点(包括自身和使用的多层代理)的IP列表。依然取决于代理的设置,可通过http头伪造;
  2. HTTP_CLIENT_IP 是代理服务器设置发送的HTTP头,代表你的客户端的真实IP。当然,人家可以选择设置与否以及设置成什么样。可通过http头伪造;
  3. REMOTE_ADDR 是你的客户端跟服务器“握手”时候的IP。如果使用代理,REMOTE_ADDR将显示代理服务器的IP。可能是用户真实IP也可能是代理IP

获取ip地址的两个方法:

  • 1.超级全局变量$_SERVER[‘REMOTE_ADDR’]
  • 2.getenv()函数获取环境变量的值。(注意这个函数不支持IIS下的php)
对应函数
function getIp(){ if (getenv("HTTP_CDN_SRC_IP") && strcasecmp(getenv("HTTP_CDN_SRC_IP"), "unknown")) $ip = getenv("HTTP_CDN_SRC_IP"); else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) $ip = getenv("HTTP_X_FORWARDED_FOR"); else if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) $ip = getenv("HTTP_CLIENT_IP"); else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) $ip = getenv("HTTP_X_FORWARDED_FOR"); else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) $ip = getenv("REMOTE_ADDR"); else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) $ip = $_SERVER['REMOTE_ADDR']; else $ip = ""; return $ip; }
改写方式
function getIp() { $arr_ip_header = [ 'HTTP_CDN_SRC_IP', 'HTTP_PROXY_CLIENT_IP', 'HTTP_WL_PROXY_CLIENT_IP', 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR', ]; $client_ip = 'unknown'; foreach ($arr_ip_header as $key) { if (!empty($_SERVER[$key]) && strtolower($_SERVER[$key]) != 'unknown') { $client_ip = $_SERVER[$key]; break; } } return $client_ip; }