Php 根据语言重定向用户

Php 根据语言重定向用户,php,redirect,Php,Redirect,我有以下代码: <?php // List of available localized versions as 'lang code' => 'url' map $sites = array( "da" => "http://www.mysite.com/", ); // Get 2 char lang code $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); // Set default langu

我有以下代码:

<?php
// List of available localized versions as 'lang code' => 'url' map
$sites = array(
    "da" => "http://www.mysite.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]);
?>
不起作用,因为它在重定向时会产生一个循环错误——至少在谷歌浏览器中是这样

编辑2

session_start();
if (isset( $_SESSION['redirect']))
{
   // do nothing / continue with rest of page
}
else
{
   $_SESSION['redirect'] = true;

// List of available localized versions as 'lang code' => 'url' map
$sites = array(
    "da" => "http://www.mysite.com/",
    "en" => "http://en.mysite.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]);

   exit();
}

您需要将默认选项添加到阵列中:

$sites = array(
    "da" => "http://www.mysite.com/",
    "en" => "http://en.mysite.com/"
);
编辑:如果您在
中调用相同的代码http://en.mysite.com/“
同样,它将创建一个循环。显而易见的解决方案是不在那里调用此代码,但另一种解决方案是设置一个会话变量以指示语言选择已经发生

要添加该会话变量,可以执行以下操作:

session_start();
if (isset( $_SESSION['redirect']))
{
   // do nothing / continue with rest of page
}
else
{
   $_SESSION['redirect'] = true;
   // your language selection code with header call
   exit();
}

您需要将默认选项添加到阵列中:

$sites = array(
    "da" => "http://www.mysite.com/",
    "en" => "http://en.mysite.com/"
);
编辑:如果您在
中调用相同的代码http://en.mysite.com/“
同样,它将创建一个循环。显而易见的解决方案是不在那里调用此代码,但另一种解决方案是设置一个会话变量以指示语言选择已经发生

要添加该会话变量,可以执行以下操作:

session_start();
if (isset( $_SESSION['redirect']))
{
   // do nothing / continue with rest of page
}
else
{
   $_SESSION['redirect'] = true;
   // your language selection code with header call
   exit();
}
这个怎么样

    $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);

    $sub_domain = ($lang == "da") ? "www" : "en";

    $link = "http://".$sub_domain.".mysite.com/";

    header('Location: ' . $link);
这个怎么样

    $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);

    $sub_domain = ($lang == "da") ? "www" : "en";

    $link = "http://".$sub_domain.".mysite.com/";

    header('Location: ' . $link);

但通过这样做,它将在重定向时创建一个循环并显示一个错误-至少在Chrome中是这样。不过,谢谢你的快速回答@Frederick Andersen如果它在丹麦版本中没有创建循环,那么在英语版本中也不应该创建循环,除非您在丹麦版本中做了与丹麦版本不同的事情。您将如何创建会话变量?并且en.mysite.com没有重定向到任何地方。@Frederick Andersen我在最后一节添加了一个小示例,其中您的代码适用于该示例。我会将我发布的所有代码放在主帖中,介于$_会话['redirect']=true;和退出();对吗?但这样做,它会在重定向时创建一个循环,并显示一个错误-至少在Chrome中是这样。不过,谢谢你的快速回答@Frederick Andersen如果它在丹麦版本中没有创建循环,那么在英语版本中也不应该创建循环,除非您在丹麦版本中做了与丹麦版本不同的事情。您将如何创建会话变量?并且en.mysite.com没有重定向到任何地方。@Frederick Andersen我在最后一节添加了一个小示例,其中您的代码适用于该示例。我会将我发布的所有代码放在主帖中,介于$_会话['redirect']=true;和退出();正当