2016-06-09 33 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) –

相關問題