PHP GEO 位置重定向 - 有没有更好的解决方案?
PHP GEO location redirect - Are there any better solutions?
编辑:一开始不是重复的。最初是如何改进或使用不同的代码根据访问者的国家重定向。
这是我目前使用的代码:
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
提前致谢
编辑:来源最终成为 answer to the duplicate question。
如果网站之间的唯一区别是语言,而与它们的实际国家无关,则您应该改为基于首选语言进行重定向。
然而,这变得非常复杂,因为 HTML headers 可以包含多种语言,其中某些语言优先于其他语言。我前段时间找到的一个解决方案,不幸的是找不到原始来源是列出可用语言,从 HTML Header 中解析语言及其偏好顺序,并确定基于在重定向到的内容上:
我不拥有 prefered_language() 函数,也没有参与其创建!
但是我在任何地方都找不到原件。如果其他人能够,请 link 它...
$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 使用。
编辑:一开始不是重复的。最初是如何改进或使用不同的代码根据访问者的国家重定向。
这是我目前使用的代码:
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
提前致谢
编辑:来源最终成为 answer to the duplicate question。
如果网站之间的唯一区别是语言,而与它们的实际国家无关,则您应该改为基于首选语言进行重定向。
然而,这变得非常复杂,因为 HTML headers 可以包含多种语言,其中某些语言优先于其他语言。我前段时间找到的一个解决方案,不幸的是找不到原始来源是列出可用语言,从 HTML Header 中解析语言及其偏好顺序,并确定基于在重定向到的内容上:
我不拥有 prefered_language() 函数,也没有参与其创建! 但是我在任何地方都找不到原件。如果其他人能够,请 link 它...
$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 使用。