php根据ip地址查地区

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php根据ip地址查地区相关的知识,希望对你有一定的参考价值。

很多网站里一打开他们的网页,便显示“江苏无锡的客户您好”等等,请问他们是怎样根据我的ip查到精确到市的地址的呢?应该有一个ip地址库的吧?
请求代码。多谢!

参考技术A 自己以前做过一个程序 根据discuz里面的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地址查地区的主要内容,如果未能解决你的问题,请参考以下文章

根据ip地址获取地区信息的接口

怎样根据IP地址查询所在地

php获取用户 地区 ip地址

如何根据 IP 地址自动填写城市、州和国家/地区表单字段?

如何根据国家/地区的IP地址重定向网站

根据访问者 IP 地址(国家/地区)将主网站重定向到子域