php 获取本机外网/公网IP的代码

  大家一般都是用$_SERVER['REMOTE_ADDR']来获取用户IP,

  但是如果使用了反向代理的,HTTP头中REMOTE_ADDR就不是用户的地址,反而是上一级代理的地址了。

  经过我的研究有两种方法来获取用户的真实外网IP。

  方法一:curl

  

复制代码 代码如下:

  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];

  }

  方法二:$_SERVER['HTTP_X_FORWARDED_FOR']来获取相应的地址

  

复制代码 代码如下:

  function get_onlineip() {

  $onlineip = '';

  if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {

  $onlineip = getenv('HTTP_CLIENT_IP');

  } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {

  $onlineip = getenv('HTTP_X_FORWARDED_FOR');

  } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {

  $onlineip = getenv('REMOTE_ADDR');

  } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {

  $onlineip = $_SERVER['REMOTE_ADDR'];

  }

  return $onlineip;

  }