OBJECTIVE
我正在尝试根据用户语言完成自动重定向。我有一个完全有效的代码:
// List of available localized versions as 'lang code' => 'url' map
$sites = array(
"da" => "http://www.fredrixdesign.com/",
"en" => "http://en.fredrixdesign.com/"
);
// Get 2 char lang code
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
// Set default language if a `$lang` version of site is not available
if (!in_array($lang, array_keys($sites)))
$lang = 'en';
// Finally redirect to desired location
header('Location: ' . $sites[$lang]);
?>
如果用户是丹麦语,这会将用户重定向到丹麦语 (da) 版本,即主/根网站。如果用户是德语、英语、波兰语等,则会将用户重定向到子域; en.fredrixdesign.com
,这是该网站的英文版本。
但是当丹麦用户访问我的网站时,就会出现问题。位于我的标头.php顶部的代码不断被执行,这意味着它不断创建重定向,最终由于重定向过多而迫使浏览器创建错误。这说明问题。
问题
那么我的问题是; 我将如何修改上面的代码,使其只执行一次重定向?如果它刚刚完成了重定向,它只会继续执行站点。
好吧,我敢打赌,如果仔细考虑一下,您可以自己找到解决方案。您所需要的只是检查当前域是否符合所需的语言。
只需稍微修改一下您的数组
$sites = array(
"da" => "www.fredrixdesign.com",
"en" => "en.fredrixdesign.com"
);
,然后为重定向添加条件
if ($sites[$lang] != $_SERVER['HTTP_HOST']) {
header('Location: http://' . $sites[$lang] . '/');
exit;
}
就这样
您可以设置一个 cookie 值,告诉您已自动将用户重定向到特定于语言的网站。如果该 Cookie 存在,请不要再次执行重定向。您可能还希望考虑用户禁用 Cookie 的情况。
你可以用GeoIP + .htaccess做到这一点,这真的很容易实现。
http://www.maxmind.com/app/mod_geoip
这样的东西可以解决问题(当然有很多沉重的好解决方案,但对于两种语言来说,做简单的事情并在以后需要时改进是没有坏处的):
function redirectIfUserIsNotOnTheGoodURLBasedOnHisLanguage()
{
// List of available localized versions as 'lang code' => 'url' map
$sites = array(
"da" => "http://www.fredrixdesign.com/",
"en" => "http://en.fredrixdesign.com/"
);
// Get 2 char lang code
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
// Set default language if a `$lang` version of site is not available
if (!in_array($lang, array_keys($sites)))
$lang = 'en';
if (($lang == 'da' && $_SERVER['SERVER_NAME'] == 'www.fredrixdesign.com') || // Danish people are on the right place
($lang == 'en' && $_SERVER['SERVER_NAME'] == 'en.fredrixdesign.com')) // Other people are on the right place
{
// no redirection
return;
}
// else redirect to desired location
header('Location: ' . $sites[$lang]);
exit(0);
}
redirectIfUserIsNotOnTheGoodURLBasedOnHisLanguage();