【问题标题】:Getting IPv6 support with php5-geoip and Maxmind database使用 php5-geoip 和 Maxmind 数据库获得 IPv6 支持
【发布时间】:2015-05-07 23:11:07
【问题描述】:

我按照以下相同的步骤设置了 geoip (http://php.net/manual/en/geoip.setup.php):

wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
gunzip GeoLiteCity.dat.gz
sudo mkdir -v /usr/share/GeoIP
sudo mv -v GeoLiteCity.dat /usr/share/GeoIP/GeoIPCity.dat

sudo apt-get install php5-geoip

这非常有效,并且已经使用 IPv4 地址数年了。然而,我没有意识到传入的 IPv6 设备有多糟糕。例如,它返回Notice: geoip_country_code_by_name(): Host 26xx:8:xx00:cf20:caxx:ff:fexx:35b5 not found

我经历了很多试图让它正常工作的事情,包括:

  • 测试v6地址并使用geoip_open("/usr/share/GeoIP/GeoIPv6.dat", GEOIP_STANDARD);

显然 geoip_open 不是一个可用的函数 ala php5-geoip

  • 我尝试过使用geoip_country_code_by_name_v6($ip)

这是另一个不可用的功能,即使 geoip_country_code_by_name($ip) 效果很好。

目前无济于事。

有什么方法可以让我轻松地在我的 PHP 代码中选择我想要使用的数据库,以便我可以简单地测试它是 IPv4 还是 IPv6 地址并加载适当的数据库?

【问题讨论】:

  • 确保您使用的是GeoLite2。旧版产品不支持 IPv6。
  • @Barmar 如果我理解正确,Geolite2 二进制文件不是 .dat 文件,因此无法与我当前与 PHP 的集成一起使用。我确实有旧版 IPv6 dat 文件,但据我所知,我无法通过我的 PHP 代码指明要查找哪个 .dat 文件。
  • 对不起,我不知道集成过程。

标签: php geoip


【解决方案1】:

为了支持 IPv6->基于上面的集成,国家代码轻松且没有不必要的文件:

获取最新的旧版 IPv6 数据的副本(我假设您已经拥有 IPv4 二进制文件):

wget http://geolite.maxmind.com/download/geoip/database/GeoIPv6.dat.gz

解压缩并将其移动到您的网络服务器可以访问的目录:

gunzip GeoIPv6.dat
mv GeoIPv6.dat /etc/usr/share/GeoIP/GeoIPv6.dat

从 Maxmind git 目录 (https://github.com/maxmind/geoip-api-php/blob/master/src/geoip.inc) 获取 geoip.inc 的副本,并将其保存在您可以访问的任何地方,无论您需要运行 geoip。

如果您像我一样安装了 php5-geoip,请使用sudo apt-get remove php5-geoip 将其删除;必要时清除。

完成上述操作后,您现在可以测试 v4 或 v6 的传入 IP 地址并获得适当的结果。

例子:

<?php
include_once('geoip.inc');

//set an IPv6 address for testing
$ip='2601:8:be00:cf20:ca60:ff:fe09:35b5';

/*
test if $ip is v4 or v6 and assign appropriate .dat file in $gi
run appropriate function geoip_country_code_by_addr() vs geoip_country_code_by_addr_v6()   
*/
if((strpos($ip, ":") === false)) {
    //ipv4
    $gi = geoip_open("/usr/share/GeoIP/GeoIP1.dat",GEOIP_STANDARD);
    $country = geoip_country_code_by_addr($gi, $ip);
}
else {
    //ipv6
    $gi = geoip_open("/usr/share/GeoIP/GeoIPv6.dat",GEOIP_STANDARD);
    $country = geoip_country_code_by_addr_v6($gi, $ip);
}
echo $ip . "<br>" . $country;

这是专门针对国家/地区的,但可以很容易地复制到城市数据。

【讨论】:

    猜你喜欢
    • 2015-10-17
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    相关资源
    最近更新 更多