PHP GeoIP导致500错误

时间:2015-10-28 15:33:30

标签: php

我对此问题非常困惑,但我试图检测用户的IP地址并根据用户国家/地区代码执行重定向。为了做到这一点,我使用了以下代码:

$url = $_SERVER['REQUEST_URI'];
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 != "GB" && strpos($url, '/?') === false) {
   if ($country_code == "IE") {
      header("Location: https://www.mymainsite.com");
      die();
   } else {
      header("Location: http://www.othersite.com");
      die();
   }
}

但是每次运行代码时都会出现500 Server错误。我设法缩小了导致它的代码行:

require_once("geoip.inc");

如果我删除此行,问题就消失了,但显然我需要该文件,因为它对地理位置至关重要。

有人会知道它为什么会抛出500错误吗?

非常感谢

1 个答案:

答案 0 :(得分:1)

我发布此帖给任何希望在其网站上实施geoip功能但遇到类似问题的人。

上述错误的原因是由于文件geoip.inc已在启用geoip extension的环境中加载。

geoip.incgeoip extension都声明了一个具有相同名称的方法,从而导致冲突。理想情况下,在调用函数之前应该检查它是否存在,可以这样做:

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

只需将有问题的函数包装在ìf语句中:

if(!function_exists('name_of_function')){.....}

问题得到纠正。

我还应该提一下@MikePurcells关于查看服务器日志的建议有助于节省大量时间。我的开发服务器是运行Linux Redhat的Apache服务器。日志位于/ var / log / httpd / error_log中。那是我检查并发现此错误的地方:

[Wed Oct 28 15:49:33 2015] [error] [client xx.xxx.xxx.xx] PHP Fatal error:  Cannot redeclare geoip_country_code_by_name()

希望能帮助任何人。