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

Posted

技术标签:

【中文标题】PHP GEO 位置重定向 - 有没有更好的解决方案? [复制]【英文标题】:PHP GEO location redirect - Are there any better solutions? [duplicate] 【发布时间】:2016-10-10 19:21:30 【问题描述】:

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

这是我目前使用的代码:

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

提前致谢

【问题讨论】:

只需发送到 google.com,它将为您重定向到国家网站。或使用浏览器语言。 我的错,我只是以google为例。我会根据国家/地区将访问者发送到我网站的其他页面或子域。获取浏览器语言并重定向到适当页面的最佳方法是什么?当然,今晚晚些时候我会用谷歌搜索它,但如果你有任何建议,请告诉我。谢谢! 对你没有实际使用的代码投反对票 不知道为什么 URL 是什么很重要,但无论如何,这很酷 唯一的区别是数据的来源。您使用的是基于位置的,而另一个系统使用的是浏览器的首选语言。如果您考虑一下,首选语言可能比位置更好,因为居住在美国的人可能更喜欢与您的us.mysite.com 不同的语言站点,除非该站点在地理上很敏感。但我猜这是关于语言翻译的,你会从浏览器中为最终用户获得更好的信息,而不是从他们的 IP 来源国获得的信息。 【参考方案1】:

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

如果站点之间的唯一区别是语言,而与其实际所在的国家/地区无关,那么您应该根据首选语言进行重定向。

但是,这变得非常复杂,因为 HTML 标头可以包含多种语言,并且某些语言优先于其他语言。我不久前找到的一个解决方案,不幸的是找不到原始来源,是列出可用语言,按照偏好顺序从 HTML Header 中解析语言,并根据要遵循的重定向来确定:

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

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

【讨论】:

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

以上是关于PHP GEO 位置重定向 - 有没有更好的解决方案? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

PHP 301 重定向位置 URI 格式

来自移动设备的 PHP 地理定位,无需重定向

根据 Cloudflare GEO TARGET 将访问者重定向到他们的语言

无法确定发生重定向的位置

扭曲的位置标头重定向

php Gravity Perks // GF更好的用户激活//按条目值设置重定向URL