PHP GEO 位置重定向 - 有没有更好的解决方案?

PHP GEO location redirect - Are there any better solutions?

编辑:一开始不是重复的。最初是如何改进或使用不同的代码根据访问者的国家重定向。

这是我目前使用的代码:

require_once('geo/geoip.inc');
$gi = geoip_open('geo/GeoIP.dat', GEOIP_MEMORY_CACHE);
$country = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);
geoip_close($gi);

if ($country == 'FR') { 
header('Location: http://fr.mysite.com');
}

if ($country == 'US') { 
header('Location: http://us.mysite.com');
}

在几个静态 (html + javascript) 病毒式网站上,每天吸引大约 100,000 名访问者,有时更多,有时更少。

有没有更好的(免费的)解决方案可以根据国家重定向?我最近从专用服务器切换到 VPS 并且当前代码似乎使用了很多 CPU 用法(或者我的主机告诉我)。我可能会回到专用服务器,但我仍然想知道是否有更好的方法,一种不会对服务器造成太大压力的方法。

此外,由于我是根据语言重定向的:

// french
if ($country == 'FR') { 
header('Location: http://fr.mysite.com');
}

//french
if ($country == 'BE') { 
header('Location: http://fr.mysite.com');
}

//french
if ($country == 'CA') { 
header('Location: http://fr.mysite.com');
}

//english
if ($country == 'US') { 
header('Location: http://us.mysite.com');
}

//english
if ($country == 'UK') { 
header('Location: http://us.mysite.com');
}

现在很累,有什么更好的办法吗?这个或没有:

    //english
    if ($country == 'US') || ($country == 'CA') { 
    header('Location: http://us.mysite.com');
    }

因此,任何来自美国或加拿大的访问者都将被重定向到 google.com

提前致谢

编辑:来源最终成为 answer to the duplicate question

如果网站之间的唯一区别是语言,而与它们的实际国家无关,则您应该改为基于首选语言进行重定向。

然而,这变得非常复杂,因为 HTML headers 可以包含多种语言,其中某些语言优先于其他语言。我前段时间找到的一个解决方案,不幸的是找不到原始来源是列出可用语言,从 HTML Header 中解析语言及其偏好顺序,并确定基于在重定向到的内容上:

我不拥有 prefered_language() 函数,也没有参与其创建! 但是我在任何地方都找不到原件。如果其他人能够,请 link 它...

$available_languages = array("en", "fr");

$default_language = "en";

function prefered_language($available_languages, $http_accept_language) {
    global $default_language;
    $available_languages = array_flip($available_languages);
    $langs = array();
    preg_match_all('~([\w-]+)(?:[^,\d]+([\d.]+))?~', strtolower($http_accept_language), $matches, PREG_SET_ORDER);
    foreach($matches as $match) {
        list($a, $b) = explode('-', $match[1]) + array('', '');
        $value = isset($match[2]) ? (float) $match[2] : 1.0;
        if(isset($available_languages[$match[1]])) {
            $langs[$match[1]] = $value;
            continue;
        }
        if(isset($available_languages[$a])) {
            $langs[$a] = $value - 0.1;
        }
    }
    if($langs) {
        arsort($langs);
        return key($langs);
    } else {
        return $default_language;
    }
}

if(isset($_COOKIE["client_lang"])){
  $lang = $_COOKIE["client_lang"];
}else{
  $lang = prefered_language($available_languages, strtolower($_SERVER["HTTP_ACCEPT_LANGUAGE"]));
  setcookie("client_lang", $lang, time() + (86400 * 30 * ), "/");
}

header('Location: http://' . $lang . '.mysite.com');

我还建议像我上面那样为客户的首选语言创建一个 cookie,因为这个功能仍然需要一些 CPU 使用。