1

ページがありmulti-languageます。クライアントブラウザの言語を検出してから、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
?>

または他の方法?ありがとう。

4

2 に答える 2

2

言語ごとに異なるURLを使用することをお勧めします(オプション2)。これにより、分析がはるかに簡単になります(/ en、/ cn、構造を使用すると、Google Analyticsはどの言語がより人気があるかを示すことができます)。

また、ユーザーは適切な言語をブックマークして共有し、別のコンピューターからその言語に戻ることができます。

最も重要なことは、同じ正規URLが2つの異なる言語に対応していると、スパイダーがページのインデックスを作成しようとしたときに大混乱を引き起こすことです。インデックスに登録されたコンテンツは予測できません。

于 2011-11-11T08:27:19.060 に答える
2

すでに質問で想定しているように、PHPで利用可能なAccept-LanguageHTTP/1.1ヘッダーを解析する必要があります$_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/");

これに対処するための既製のライブラリを探している場合、既存のソリューションの1つはSymfonyで HttpFoundation\Requestあるか、PEARにありHTTP::negotiateLanguageます。

PHP intl拡張機能には、関連する別の低レベル関数がありますが、配列ではなく単一の値を提供します。locale_accept_from_http

HTTP関連の詳細情報に関するもう1つの一般的なリソースは、PHPでのHTTPリクエストの高度な処理です

于 2011-11-11T09:22:36.280 に答える