php根据ip地址查地区
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php根据ip地址查地区相关的知识,希望对你有一定的参考价值。
很多网站里一打开他们的网页,便显示“江苏无锡的客户您好”等等,请问他们是怎样根据我的ip查到精确到市的地址的呢?应该有一个ip地址库的吧?
请求代码。多谢!
/**
* ip地址所属地区计算
* 修改自 discuz
* 使用dicuz tinyipdata数据文件
* 将一些英文提示修改为汉字
* $is_simple true的话显示到市 false显示到网通电信等等
******/
function convertip($ip,$is_simple=true,$ipfile='include/data/ip.dat')
$return = '';
if( !file_exists($ipfile) ) $ipfile = '../'.$ipfile;
if(preg_match("/^\d1,3\.\d1,3\.\d1,3\.\d1,3$/", $ip))
$iparray = explode('.', $ip);
if($iparray[0] == 10 || $iparray[0] == 127 || ($iparray[0] == 192 && $iparray[1] == 168) || ($iparray[0] == 172 && ($iparray[1] >= 16 && $iparray[1] <= 31)))
return '局域网';
elseif($iparray[0] > 255 || $iparray[1] > 255 || $iparray[2] > 255 || $iparray[3] > 255)
return 'ERR';
elseif($is_simple)
return change_simply_area(convertip_tiny($ip, $ipfile));
else
return convertip_tiny($ip, $ipfile);
/**
* 从ip文件得到ip所属地区
*
* 过滤掉了具体的位置(如 网通/电信/**网吧) 基本到市
***/
function convertip_tiny($ip, $ipdatafile)
static $fp = NULL, $offset = array(), $index = NULL;
$ipdot = explode('.', $ip);
$ip = pack('N', ip2long($ip));
$ipdot[0] = (int)$ipdot[0];
$ipdot[1] = (int)$ipdot[1];
if($fp === NULL && $fp = @fopen($ipdatafile, 'rb'))
$offset = unpack('Nlen', fread($fp, 4));
$index = fread($fp, $offset['len'] - 4);
elseif($fp == FALSE)
return '- Invalid IP data file';
$length = $offset['len'] - 1028;
$start = unpack('Vlen', $index[$ipdot[0] * 4] . $index[$ipdot[0] * 4 + 1] . $index[$ipdot[0] * 4 + 2] . $index[$ipdot[0] * 4 + 3]);
for ($start = $start['len'] * 8 + 1024; $start < $length; $start += 8)
if ($index$start . $index$start + 1 . $index$start + 2 . $index$start + 3 >= $ip)
$index_offset = unpack('Vlen', $index$start + 4 . $index$start + 5 . $index$start + 6 . "\x0");
$index_length = unpack('Clen', $index$start + 7);
break;
fseek($fp, $offset['len'] + $index_offset['len'] - 1024);
if($index_length['len'])
return mb_convert_encoding(fread($fp, $index_length['len']),'utf-8','gb2312'); //将读出的gb编码数据转成utf-8并返回
else
return '未知';
function change_simply_area($area)
$tmp = explode(' ',$area); //过滤掉一些具体信息
return $tmp[0];
里面那个ipfile你可以去下载一个discuz 在 ipdata目录里面有wry.dat的文件就是了 其实这个就是网上用的最多的那个纯真版数据库 很多显示ip的qq用的也是那个
这两个函数的原型参考 discuz 里面 include\misc.func.php
共同学习进步 :)
参考资料:http://www.nayitian.net
本回答被提问者采纳根据国家/地区重定向,但如果 IP 被列入白名单则允许
【中文标题】根据国家/地区重定向,但如果 IP 被列入白名单则允许【英文标题】:Redirect based on Country but allow if IP is whitelisted 【发布时间】:2020-11-25 06:10:24 【问题描述】:我有一个脚本可以重定向来自我的国家的人,并允许所有其他人留下来,如果不是我的国家。
如果我的 IP 地址来自应该全部重定向的国家/地区,我如何才能将其列入白名单?
require_once('geoplugin.class.php');
$geoplugin = new geoPlugin();
$geoplugin->locate();
// create a variable for the country code
$var_country_code = $geoplugin->countryCode;
// redirect based on country code:
if ($var_country_code == "BG")
header('Location: https://wikipedia.org/');
else if ($var_country_code == "E1")
header('Location: https://website.xyz/wordpress');
?>```
【问题讨论】:
如果你有一个静态 ip.assign 给一个变量,并将它与国家代码进行比较。如果是动态的,请在线查找您的 IP 地址并在 else if 循环中添加比较检查 是什么让您无法在脚本中添加更多条件? 【参考方案1】:我认为您可以尝试获取客户端 IP,然后检查您的 IP(如果它是静态的) 如果它是 TRUE 那么你可能不会重定向如果不是(否则)到达那里的位置并继续你的代码的其余部分
if (client_IP == "Your own IP")
header('Location: Whatever location you want');
else if ($var_country_code == "BG")
header('Location: https://wikipedia.org/');
else if ($var_country_code == "E1")
header('Location: https://pasted.xyz/wordpress');
希望对你有帮助
【讨论】:
它仍然将我重定向到***...就像没有将我的 IP 从功能中列入白名单以重定向 BG 国家代码人员。 您使用了什么代码但仍然无法正常工作?你确定你的 IP 是静态的吗? 是的,我确信它是静态的。该脚本有效,但 ClientIP 来自 BG,但将我重定向到***,而不是我想要重定向的链接。 我想你没有明白我的意思,你将在脚本中硬编码你的 IP 地址,并将客户端 IP 而不是国家,只是他的数字 IP 与你硬编码的 IP 进行比较如果不是你,它不会评估为 TRUE(我们希望) 你用什么函数获取客户端IP?你知道“if (client_IP == "Your own IP") code doesn't work”就像伪代码,而不是实际代码?以上是关于php根据ip地址查地区的主要内容,如果未能解决你的问题,请参考以下文章