淘宝公开的IP库http://ip.taobao.com/
淘宝公开的REST API接口:http://ip.taobao.com/service/getIpInfo.php?ip=[ip地址字串],返回内容以json格式的
不过限制了每个用户的访问频率需小于10qps
获取ip
一、如果没有使用代理服务器,
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
”值。
/*获取客户端ip*/
protected function getIp()
{
if (isset($_SERVER['HTTP_CLIENT_IP']) && strcasecmp($_SERVER['HTTP_CLIENT_IP'], "unknown")) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} else if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], "unknown")) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else if (isset($_SERVER['REMOTE_ADDR']) && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) {
$ip = $_SERVER['REMOTE_ADDR'];
} else if (isset($_SERVER['REMOTE_ADDR']) && isset($_SERVER['REMOTE_ADDR']) && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) {
$ip = $_SERVER['REMOTE_ADDR'];
} else {
$ip = "";
}
return ($ip);
}
根据ip获取归属地址
/**
* @description: 利用淘宝的ip地址库获获取ip + 地址
* @param {type}
* @return:
*/
protected function _get_ip_dizhi()
{
$opts = array(
'http' => array(
'method' => "GET",
'timeout' => 5
),
);
$context = stream_context_create($opts);
$ip = $this->getIp();
if (strpos($ip, "127.0.0.") === true) {
return '';
}
$url_ip = 'http://ip.taobao.com/service/getIpInfo.php?ip=' . $ip;
$str = @file_get_contents($url_ip, false, $context);
if (!$str) {
return "";
}
$json = json_decode($str, true);
$country = '';
$province = '';
$city = '';
$area = '';
if ($json['code'] == 0) {
// $ipcity = $json['data']['region'] . $json['data']['city'];
$country = $json['data']['country'];
$province = $json['data']['region'];
$city = $json['data']['city'];
$area = $json['data']['area'];
}
$data = compact('country', 'province', 'city', 'area', 'ip');
return $data;
}