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 位置重定向 - 有没有更好的解决方案? [复制]的主要内容,如果未能解决你的问题,请参考以下文章