3

geoIPユーザーを自分の .com サイトから関連する国のドメイン (.fr、.es、.co.uk ... など) にリダイレクトする機能の実装に取り​​組んでいます。

index.phpユーザーのIPを確認するために、次のことを行いました。

ini_set('display_errors', 1);
require_once("geoip.inc");
$gi = geoip_open("GeoIP.dat",GEOIP_STANDARD);
$country_code = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);
geoip_close($gi);

if($country_code == 'ES')
{
        header('Location: https://www.testsite.es');
}
elseif($country_code == 'GB')
{
        header('Location: https://www.testsite.co.uk');
}
elseif($country_code == 'FR')
{
        header('Location: https://www.testsite.fr');
}
else {
        header('Location: https://www.testsite.com/home');
}

変数をチェックすると、$country_codeそれは空の文字列であり、その結果、上記は失敗し、常にヒットしhttps://www.testsite.com/homeます...

コードを調べ始めたところ、最初にこのメソッドを呼び出していることに気付きました。

function geoip_country_code_by_addr($gi, $addr) {

    if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) {
        $record = geoip_record_by_addr($gi, $addr);
        if ($record !== false) {
            return $record->country_code;
        }
    } else {
        $country_id = geoip_country_id_by_addr($gi, $addr);

        if ($country_id !== false) {
            return $gi->GEOIP_COUNTRY_CODES[$country_id];
        }
    }
    return false;
}

これは次を呼び出します:

function geoip_country_id_by_addr($gi, $addr) {
    $ipnum = ip2long($addr);
    return _geoip_seek_country($gi, $ipnum) - GEOIP_COUNTRY_BEGIN;
}

失敗して「0」を返す理由がわかりませんか? Maxminds geoip.inc php を使用して国コードを確認しています。

mbstringphp.ini ファイル内で有効になっていることを確認しましたが、有効です。何らかの理由で、渡した IP に基づいて国コードが見つからないだけです。これを引き起こしている可能性のあるものに関して、誰か助けがありますか?

4

1 に答える 1

0

問題を解決したと言いたかっただけです。私の側の間違いで、おそらく休憩が必要な兆候です!

Maxmind から提供された範囲内でgeoip.inc.php、最初に次のエラーが発生しました。

438 行目の geoip.inc で geoip_country_code_by_name() を再宣言できません

これを修正するには、メソッドが定義されているかどうかを確認し、定義されていない場合は次のように使用します。

if (!function_exists('geoip_country_code_by_name')) {
    function geoip_country_code_by_name($gi, $name) {
        $country_id = geoip_country_id_by_name($gi, $name);
        if ($country_id !== false) {
            return $gi->GEOIP_COUNTRY_CODES[$country_id];
        }
        return false;
    }
}

残念ながら、上記のコードに小さなタイプミスがあり、コードが適切に実行されなかったため、毎回 0 が返されました。

于 2015-09-07T14:48:17.637 に答える