2011-11-11 1 views
1

私はmulti-languageのページを持っています。クライアントのブラウザの言語を検出して301のホームページなどを作ってみたいです。しかし、どの方法がSEOにとってより良いのかはわかりません。私は知らないweb spiderどのようなもの?または他の方法ですか?ブラウザの言語を検出して301をホームページにリダイレクトする最も快適な方法はどれですか

<?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 
?> 

OR

<?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 
?> 

あるいは他の方法はありますか?ありがとう。

答えて

2

あなたの疑問にお答えしますように、のPHPで利用可能なAccept-LanguageHTTP/1.1ヘッダーを解析する必要があります。配列のような方が良いPHP以内に対応できる構造に解析するために、この最初のニーズ、:

da, en-gb;q=0.8, en;q=0.7のために戻ります
/** 
* 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; 
} 

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; 
    } 
} 

最後にあなたがに基づいてリダイレクトを行うことができます210(またはincludeまたは何でも):

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

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

PHPの国際拡張が関連している別の低レベルの機能を有している、しかし、それだアレイが、単一の値を提供しない:よりHTTP関連情報のための別の一般的なリソースがAdvanced handling of HTTP requests in PHPあるlocale_accept_from_http

を。

+0

良い指示をいただきありがとうございます。申し訳ありません、私は今、私の最初のサイトをオンラインで準備しています。 '301 redirect'はウェブスパイダーによって不正行為とみなされますか?私はこの行動が私のサイトをGoogleサンドボックスに入れさせるのではないかと心配しています... – cj333

+1

それは少し依存します。 cnバージョンと同じように、en言語(HTTPメタタグを追加)でサイトのenバージョン内に表示します。 enはデフォルトであるため、googleは主にenバリアントを処理します。各ページのcnバージョンへのリンクを追加すると(言語切り替えのような中国語の場合)、googleはそのコンテンツも見つけて中国語の読者に提供します。 **編集**参照http://www.w3.org/International/tutorials/language-decl/ – hakre

+0

等しく重み付けされた2つの言語がある場合、関数はそれらの言語の順序を逆にします。それが望ましいのかどうかはわかりません。私はオーダー自体にも価値があると信じています。 – Michielvv

1

言語ごとに異なるURLを使用することをお勧めします(オプション2)。分析がはるかに簡単になります(/ en、/ cn、構造を使用すると、Googleアナリティクスはどの言語がより一般的であるかを示すことができます)。

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

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

関連する問題