【问题标题】:Which is the most seo-friendly way to detect browser language and redirect 301 to home page这是检测浏览器语言并将 301 重定向到主页的最友好的方式
【发布时间】:2011-12-26 20:06:57
【问题描述】:

我有一个multi-languagepage,我想检测客户端浏览器的语言,然后制作一个301主页或其他东西。但我不确定哪种方式更适合 seo。不知道web spider喜欢哪一个?还是其他方式?

<?php 
$LG=$_SERVER['HTTP_ACCEPT_LANGUAGE']; 
if (preg_match('/^[zZ][hH]/', $LG)) {
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://mydomain.com/cn/");
exit();} //jump to chinese version
else { 
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://mydomain.com/en/");
exit();} //jump to english version
?>

或

<?php 
$LG=$_SERVER['HTTP_ACCEPT_LANGUAGE']; 
if (preg_match('/^[zZ][hH]/', $LG)) {
include ("http://mydomain.com/cn/");
} //include chinese version
else { 
header("HTTP/1.1 301 Moved Permanently");
include ("http://mydomain.com/en/");
} //include english version
?>

或者其他方式?谢谢。

【问题讨论】:

    标签: php seo http-headers http-accept-language


    【解决方案1】:

    正如您在问题中已经假设的那样,您需要解析 Accept-LanguageHTTP/1.1 标头,该标头在 PHP 中的 $_SERVER['HTTP_ACCEPT_LANGUAGE'] 中可用。这首先需要被解析成一个你可以在 PHP 中更好地处理的结构,比如一个数组:

    /**
     * Convert Accept Language to sorted PHP array
     * 
     * Related HTTP Specs:
     *   <http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4>
     *   <http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.9>
     *
     * @param string $accept header value
     * @return array ([language-range] => qvalue, ...)
     */
    function http_accept_language_array($accept = NULL)
    {
        if (!$accept && isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
            $accept = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
        $accept = (string) $accept;
    
        $pattern = '/([a-z]{1,8}(-[a-z]{1,8})?)(;q=([01](?:\.[0-9]{0,3})?))?(?=$|,[ ]*)/i';
        preg_match_all($pattern, $accept, $matches);
    
        $array = array();
        if (count($matches[1]))
        {
            list(, $ranges,,, $qvals) = $matches;
            # normalize ranges
            foreach ($ranges as &$range)
                $range = strtolower($range);
            unset ($range);
            # set default qvalue 1
            foreach ($qvals as &$qval)
                if ('' === $qval) $qval = '1';
            unset ($qval);        
            $array = array_combine($ranges, $qvals);
            arsort($array, SORT_NUMERIC);
        }
        return $array;
    }
    

    da, en-gb;q=0.8, en;q=0.7 会返回哪个:

    array(3) {
      ["da"]    => string(1) "1"
      ["en-gb"] => string(3) "0.8"
      ["en"]    => string(3) "0.7"
    }
    

    然后您需要解析这个排序数组以找到您的第一个匹配项,将您的偏好设置为en 默认值:

    $lang = 'en';
    foreach (http_accept_language_array() as $range => $qvalue)
    {
        if (preg_match('/^zh[$-]/', $range))
        {
            $lang = 'cn';
            break;
        }
    }
    

    最后你可以根据$lang(或包含或其他)进行重定向:

    header("HTTP/1.1 301 Moved Permanently");
    header("Location: http://mydomain.com/$lang/");
    

    如果您正在寻找一个现成的库来处理这个问题,一个现有的解决方案是 Symfony's HttpFoundation\Request 或在 PEAR 中有 HTTP::negotiateLanguage。

    PHP intl 扩展有另一个相关的低级函数,但它不提供数组,而是提供单个值:locale_accept_from_http

    另一个获取更多 HTTP 相关信息的通用资源是Advanced handling of HTTP requests in PHP。

    【讨论】:

    • 感谢您的指导。抱歉,我现在正在准备我的第一个在线网站。 301 redirect 会被网络蜘蛛视为作弊吗?我担心此操作会导致我的网站被放入谷歌沙盒...
    • 这取决于一点。在您的网站的 en 版本中显示它是 en 语言(添加 HTTP 元标记),对于 cn 版本也是如此。由于 en 是默认设置,google 将首先处理 en 变体。如果您在每个 en 页面上也添加指向 cn 版本的链接(对于中文,如语言切换器),谷歌也会找到该内容并将其提供给中国读者。 编辑见w3.org/International/tutorials/language-decl
    • 如果有两种同等权重的语言,您的函数会颠倒它们的顺序。我不确定这是否可取,因为我相信订单本身也有一些价值。
    • @Michielvv:好地方!但如果这本书是真的,我无法理解,因为规格不处理这种情况。然而,代码的一个真正问题实际上是,q 的 0 意味着不应该采用该语言。我认为在这个例子中(也)没有正确处理。感谢您的反馈!
    【解决方案2】:

    我建议为每种语言使用不同的 URL(选项 2)。这将使分析变得更加容易(如果您使用 /en、/cn、结构,Google Analytics 可以显示哪种语言更受欢迎)。

    此外,用户可以收藏和分享正确的语言,然后从另一台计算机返回。

    最重要的是,当蜘蛛试图索引页面时,让相同的规范 URL 服务于两种不同的语言会造成严重破坏。编入索引的内容将是不可预测的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-17
      • 2014-02-24
      • 2016-02-18
      • 1970-01-01
      • 2010-11-05
      • 2011-11-02
      • 2012-12-07
      相关资源
      最近更新 更多