PHP獲取ip地址

1.’REMOTE_ADDR’ 是遠端IP,默認來自tcp 鏈接是,客戶端的Ip。也就是直接連服務器的客戶端IP。若是對方經過代理服務器上網,獲取到的是代理服務器的IP了。例如:c->proxy->s; 若是咱們使用了nginx之類的反向代理服務器,咱們獲取的就是nginx代理服務器的ip。例如:c->nginx->snginx

2.’HTTP_X_FORWARDED_FOR’的格式:HTTP_X_FORWARDED_FOR = clientip,proxy1,proxy2 全部IP用」,」分割。 爲了能在複雜的網絡中獲取到最接近用戶的IP(有多是代理IP地址)。在經過了HTTP 代理或者負載均衡服務器時會添加該項,經過一次,就會加上一個的ip。固然用戶能夠僞造該項的第一個; 例如 u(192.168.1.1)->proxy1(192.168.1.2)->proxy2(192.168.1.3)->nginx(192.168.1.5)->s ,則X-Forwarded-For: 192.168.1.1,192.168.1.2,192.168.1.3,192.168.1.4 可是後面的ip是代理服務器或者nginx反向代理服務器加上的ip,後面的ip是僞造不了的; 獲取的HTTP_X_FORWARDED_FOR 前面的地址都有多是用戶僞造的,最後一個是僞造不了的。因此咱們能夠從後面往前取第一個不在咱們ip數組中的地址。數組

/**
 * 獲取用戶IP
 * @param type $allowProxys(咱們負載均衡服務器ip)
 * @return string
 */
function get_client_ip($allowProxys = array())
{
    if (getenv('REMOTE_ADDR'))
    {
        $onlineip = getenv('REMOTE_ADDR');
    }
    else
    {
        $onlineip = $_SERVER['REMOTE_ADDR'];
    }
    if (in_array($onlineip, $allowProxys))
    {
        if (getenv('HTTP_X_FORWARDED_FOR'))
        {
            $ips = getenv('HTTP_X_FORWARDED_FOR');
        }
        else if ($_SERVER['HTTP_X_FORWARDED_FOR'])
        {
            $ips = $_SERVER['HTTP_X_FORWARDED_FOR'];
        }
        if ($ips)
        {
            $ips = explode(",", $ips);
            $count =  count($ips);
            for($i = $count-1 ;$i < $count; $i--)
            {
            	if (in_array($ips[$i], $allowProxys)) 
            	{
            		array_pop($ips);
            	}
            	else 
            	{
            		break;
            	}	
            }	
            	
            $curIP = array_pop($ips);
            $onlineip = trim($curIP);
        }
    }
    if (filter_var($onlineip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4))
    {
        return $onlineip;
    }
    else
    {
        return '0.0.0.0';
    }
}
相關文章
相關標籤/搜索