2016-06-09 102 views
0

编辑:不是重复开始。最初是如何改进或使用不同的代码重定向基于访问者的国家。PHP GEO位置重定向 - 有没有更好的解决方案?

这是我目前使用的代码:一对夫妇的静态(HTML + JavaScript的),在10万左右的游客带来了一天的病毒网站,有时多有时少的

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'); 
} 

有没有更好的(和免费的)基于国家的重定向的解决方案?我最近从一个专用服务器切换到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

在此先感谢

+0

只需发送到google.com,它会重定向到您的国家/地区网站。或使用浏览器语言。 – 2016-06-09 23:50:17

+0

我的错,我只是以谷歌为例。我会根据国家/地区将访问者发送到我的网站的其他页面或子域。获取浏览器语言和重定向到合适页面的最佳方式是什么?当然我今晚晚些时候会谷歌它,但如果你有任何建议让我知道。谢谢! – xetsr

+0

downvote代码你实际上并没有使用 – 2016-06-09 23:55:28

回答

0

编辑:来源结束了是一个answer to the duplicate question

如果网站之间的唯一区别是语言,而与其实际国家无关,则应该根据首选语言进行重定向。

但是,这变得非常复杂,因为HTML标头可以包含多种语言,而某些语言则优先于其他语言。我后来发现了一个解决方案,但不幸的是,找不到原始源代码来制作可用语言的列表,并根据其首选顺序从HTML标头中解析出语言,然后根据所遵循的重定向来确定:

我不拥有首选功能,并且不会在创建过程中使用任何部分! 但我无法找到原来的任何地方。如果别人能,请链接吧...

$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使用率。

+0

谢谢!这正是我需要的。 – xetsr

+0

当然!如果他们完全回答您的问题,请记住将问题标记为已接受。 (这适用于所有问题,不仅仅是我的:P) –

相关问题