IPv6地址上的inet_pton()警告 - 我的代码或服务器配置错误?

时间:2014-03-28 14:32:15

标签: php ipv6 maxmind

我正在开发一个使用第三方网站的开源插件。它包含此代码段以获取访问者国家/地区代码:

$visitorIP = $_SERVER['REMOTE_ADDR'];

if( filter_var($visitorIP, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) ) {
    $geoIPdb = 'GeoIP.dat';
} elseif ( filter_var($visitorIP, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) ) {
    $geoIPdb = 'GeoIPv6.dat';
} else return 'something';

include_once($this->maxmindDirectory . 'geoip.inc');
$gi = geoip_open($this->maxmindDirectory . $geoIPdb, GEOIP_STANDARD);

if($geoIPdb == 'GeoIP.dat') {
    $ISOcode = geoip_country_code_by_addr($gi, $visitorIP); }
else {
    $ISOcode = geoip_country_code_by_addr_v6($gi, $visitorIP);
}

我的服务器和ISP都使用IPv4,代码适用于IPv4地址;但我无法测试真实的访问者IPv6地址。

但是,如果我通过硬编码$visitorIP作为IPv6地址进行测试,我会得到一个" inet_pton()[function.inet-pton]:无法识别的地址"警告。

  1. 这是我的代码中的错误,还是我的服务器/ PHP配置? (当我检查AF_INET6时未定义。)

  2. 如果不是我的错误,此代码是否会在$ _SERVER [' REMOTE_ADDR']包含IPv6地址的服务器上正常运行,或者是否仍需要添加其他检查?

  3. 感谢您的任何建议。

1 个答案:

答案 0 :(得分:4)

您的服务器的PHP在没有IPv6支持的情况下编译(使用--disable-ipv6),因此您的代码失败,但它应该在PHP支持IPv6的服务器上正常工作。

以下是如何检查PHP安装是否支持IPv6,取自here

if (defined('AF_INET6')) {
  echo "PHP was compiled without --disable-ipv6 option";
} else {
  echo "PHP was compiled with --disable-ipv6 option";
}

顺便说一句,这就是我重写你的代码的方式,它对我来说看起来更好,但我不是一个PHP专家,所以使用它需要你自己承担风险。

function getISOcode($visitorIP) {
    if(filter_var($visitorIP, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
        $geoIPdb = "GeoIP.dat";

        include_once($this->maxmindDirectory."geoip.inc");
        $gi = geoip_open($this->maxmindDirectory.$geoIPdb, GEOIP_STANDARD);

        return geoip_country_code_by_addr($gi, $visitorIP);
    } elseif (filter_var($visitorIP, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
        $geoIPdb = "GeoIPv6.dat";

        include_once($this->maxmindDirectory."geoip.inc");
        $gi = geoip_open($this->maxmindDirectory.$geoIPdb, GEOIP_STANDARD);

        return geoip_country_code_by_addr($gi, $visitorIP);
    } else {
        return false; // or throw an exception about the address being invalid
    }
}