我正在努力实现一些 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 来检查国家代码。
我已经检查过在我的 php.ini 文件中启用了 mbstring
并且它是。出于某种原因,它只是找不到基于我传递给它的 IP 的国家/地区代码。有没有人对可能导致这种情况的原因有任何帮助?
最佳答案
只是想说我已经解决了这个问题。我犯了一个错误,可能是我需要休息的迹象!
在 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。
关于php - GeoIP 函数返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32440558/