首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP位置重定向-有更好的解决方案吗?

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

Stack Overflow用户
提问于 2016-06-09 23:35:39
回答 1查看 1.1K关注 0票数 0

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

下面是我目前使用的代码:

代码语言:javascript
复制
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)病毒网站上,每天吸引大约10万访问者,有时更多,有时更少。

有什么更好的(免费的)解决方案来根据国家进行重定向吗?最近,我从专用服务器切换到VPS,当前的代码似乎使用了大量的CPU (至少我的主机告诉我了)。我可能会回到专用服务器,但我仍然想知道是否有更好的方法,一个不太强调服务器的方法。

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

代码语言:javascript
复制
// 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');
}

现在太累了,有什么更好的方法吗?这或否:

代码语言:javascript
复制
    //english
    if ($country == 'US') || ($country == 'CA') { 
    header('Location: http://us.mysite.com');
    }

所以任何从美国或加拿大来的人都会被转到google.com

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-10 00:16:17

编辑:源最终是一个answer to the duplicate question

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

但是,这变得非常复杂,因为HTML标题可以包含多种语言,某些语言优于其他语言。不久前,我找到了一个解决方案,但遗憾的是找不到原始的源代码,就是列出可用的语言,用它们的优先顺序解析HTML头之外的语言,并根据重定向到下面的内容来确定:

我没有拥有prefered_language()函数,也没有参与它的创建!,但是我在任何地方都找不到原版。如果别人能,请把它连接起来..。

代码语言:javascript
复制
$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的使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37737820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档