我对此问题非常困惑,但我试图检测用户的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错误吗?
非常感谢
答案 0 :(得分:1)
我发布此帖给任何希望在其网站上实施geoip功能但遇到类似问题的人。
上述错误的原因是由于文件geoip.inc
已在启用geoip extension
的环境中加载。
geoip.inc
和geoip 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()
希望能帮助任何人。