- PR -

ロボットのAccept-Languageヘッダについて

投稿者投稿内容
BT
ベテラン
会議室デビュー日: 2006/09/24
投稿数: 81
お住まい・勤務地: Tokyo
投稿日時: 2008-08-27 19:32
骨骨★Rock!さんの書かれた内容でほぼその通りです。
クエリ文字をパスに書き換えてやれば、おっしゃる通り言語によりディレクトリが違うように見えるのでベターだと思いますが、クエリ文字のパラメータが少なければあまり気にしなくてもよいかもしれません。

手動選択ではブラウザの設定は無視してクエリ文字のみで言語を判断しています。クエリ文字の言語情報がない場合には既定の日本語と判断します。これは、こうしないと不都合があったというわけではなく、日本に居住している方が対象というのがあり、まずは日本語で表示して、母国語が日本語以外の方は自ら言語を選択してもらう方がよいかなと思ったためで、コンテンツ次第だと思いますので、どちらでもよいかと。
その代わり、言語選択ができることがわかるようにドロップダウンリストではなく選択可能な言語をハイパーリンクのアイコン(国旗)で表示して、より直感的に分かるようにしています。

なお、ドロップダウンリストではないので、リダイレクトは使っていません。リダイレクトを使いすぎるとこれまたSEO的にはよろしくなさそうなのでHyperLink.NaviageUrlに直接URLを指定しています。マスターページに配置しているとページや選択言語、状態によりUrlが変わってきますのでそれに応じてNaviageUrlを書き換えないといけません。

引用:

骨骨★Rock!さんの書き込み (2008-08-27 17:36) より:

hyperLink.NaviageUrl ="targetPage.aspx?ln=" +Request.QueryString["ln"].ToString()



イメージは上記のような感じですが、実際には言語以外のクエリ文字も付いていたりしますので、もう少し複雑になります。私はURL処理用のクラスを作ってそこでクエリ文字の解析と組み立てを行うコードを書き、それを全ての内部移動用ハイパーリンクから呼び出すという方法を取ろうとしています。

これらの手法は結果的にCMSのDotNetNukeの多言語対応方法に似通ったものになりつつあります(ちなみに、DotNetNukeではコンテンツ部分の多言語化は未対応ですが)。

http://dotnetnuke.jp/

たぶん実装が進むにつれ更に似てくると思いますし、ソースも付いてますので一度そちらを見てもらうのがよいと思います。クエリ文字のパスへの置換もやっていますし、他にもいろいろ勉強になるところが多いです。
骨骨★Rock!
常連さん
会議室デビュー日: 2007/09/11
投稿数: 38
投稿日時: 2008-08-28 10:32
BT様、
詳しいご解説ありがとうございます。
大変参考になりました。

引用:

手動選択ではブラウザの設定は無視してクエリ文字のみで言語を判断しています。クエリ文字の言語情報がない場合には既定の日本語と判断します。これは、こうしないと不都合があったというわけではなく、日本に居住している方が対象というのがあり、まずは日本語で表示して、母国語が日本語以外の方は自ら言語を選択してもらう方がよいかなと思ったためで、コンテンツ次第だと思いますので、どちらでもよいかと。
その代わり、言語選択ができることがわかるようにドロップダウンリストではなく選択可能な言語をハイパーリンクのアイコン(国旗)で表示して、より直感的に分かるようにしています。



現在私の使っている方法は、Session_Startでユーザーの言語を判別し、その値をセッションにいれています。同時にクッキーにも保存し、次回以降アクセスしたときにはクッキーに格納されている言語設定を優先させます。
各ページではセッションの言語設定から表示する言語を判別するようになっています。
言語の切り替えは、ImageButtonで行っていましたが、今回これをHyperLinkに変更することで、検索エンジンのボットが通れるように道筋を作ってあげればよいと思っていましたが、それだけの対応では不十分なのでしょうか?
つまり、いくらボットが通れるようになっても、クエリーストリングに言語情報を持たせるようにしないと、日本語のページも英語のページもボットから見て、おなじページDefault.aspxなので、1つしかインデックスされないのでしょうか?
これをDefault.aspx?ln=ja-JPとDefault.aspx?ln=en-USにする事によって両方の言語で
インデックスさせる方法がBT様のとられている方法という事でしょうか?
質問ばかりで申し訳ありませんが、アドバイスをいただけますと幸いです。

引用:

これらの手法は結果的にCMSのDotNetNukeの多言語対応方法に似通ったものになりつつあります(ちなみに、DotNetNukeではコンテンツ部分の多言語化は未対応ですが)。

http://dotnetnuke.jp/

たぶん実装が進むにつれ更に似てくると思いますし、ソースも付いてますので一度そちらを見てもらうのがよいと思います。クエリ文字のパスへの置換もやっていますし、他にもいろいろ勉強になるところが多いです。



DotNetNukeも見てみたいと思います。ありがとうございます。
BT
ベテラン
会議室デビュー日: 2006/09/24
投稿数: 81
お住まい・勤務地: Tokyo
投稿日時: 2008-08-28 13:25
もともとこのスレッドを立ち上げたのは、検索エンジンがどういう検索をかけてくるのか分からなかったため意図に反した検索をされたらまずいという意味からで、それさえ分かれば対策はおのずから分かってくると思います。

(1)検索エンジン自らいろんな言語でリクエスをかけてクロールしてくれるの?
(2)クロールの際にCookieは使うの?
(3)POSTメソッドやJavascriptは解釈してくれるの?

あたりがキーだと思うのですが、検索エンジンによっても違ってくるでしょうが、(1)はここで回答をもらったように、ないだろうということだと思います。また、(3)も将来はともかく現状ではまずなさそうです。(2)はどうなんでしょう。分かりませんがあまりなさそうな気がします。というのも、検索した結果を表示する場合に、同じURLなのにブラウザの設定やCookieの内容で結果が違うというのは検索エンジンとしてはよろしくないのでそんなことはしないのではと思います。

実際、検索しても同一のURLに複数の結果が表示されているというのは見たことがありませんし、もしあったとしても開いてみたら内容が違っていたというのでは検索の意味をなさないのではと思います。

つまりは、SEO的な観点からはURLとコンテンツは1対1でなければならないといけないのではないかということです。
だとすれば、Sessionで言語情報を保持するのは良いとしても、クロール時にそれを求めるのは無理で、URLとして区別しないとダメなのではないかと思います。

ただ、インデックスされるか否かということに関して言えば、検索エンジンが辿れればOKというのはいえると思いますので、URLが一意でかつハイパーリンクとしてURLが辿っていけるようになってさえいればおっしゃる通りインデックスはしてくれると思います。

例えば、私のやり方のように全ての内部移動用ハイパーリンクを書き換えるようなことをしなくても、言語切り替え用のハイパーリンクをマスターページに置いて、それをクリックすることで言語を切り替えるようにしておけば多言語ページのクロールは可能ですし、言語情報の保持もCookieでやればそれで問題はないと思います。

ただ、両者の違いは、辿れる道筋が違います。
例えば、以下のページがあり、

(1)トップ(Default.aspx)
(2)商品カテゴリ一覧(Products.aspx)
(3)商品カテゴリ内商品一覧をProducts.aspx?c=1(カテゴリIDが1の場合)

とした場合に、単純に言語リンクを設置した場合には各ページの多言語版ページは必ず既定の言語のページ(例えば日本語)からしかリンクされませんので(3)[英語]をクロールするためには

(1)[日本語]→(2)[日本語]→(3)[日本語]→(3)[英語]

というリンクを辿ることになります。
検索結果で、サイトの下にインデントした形で下位のページが出てくる場合がありますが、そういう場合だと日本語のページの下に英語が混在して出てくるようになるかもしれません。(未確認)
一方、URLを書き換える場合には、上の経路も含めて複数ありますが、

(1)[日本語]→(1)[英語]→(2)[英語]→(3)[英語]

というのが自然な経路となり、URLをパス形式にした場合にも合致します。そもそも、パス形式とする場合にはURLを書き換える必要がでてくると思いますし。

この経路の違いが検索結果にどのような影響をおよぼすかは分かりませんが、少なくとも後者の方が自然ではあろうと思います。

なお、私も現在進行形なのでどれが正解かというは分かりません。ただ、DotNetNukeという実例があることで全くの手探りではなくある程度方向感はもてているという程度です。
骨骨★Rock!
常連さん
会議室デビュー日: 2007/09/11
投稿数: 38
投稿日時: 2008-08-28 21:25
BT様、
詳しくご説明いただきましてありがとうございます。
本当に勉強になりました。

引用:

もともとこのスレッドを立ち上げたのは、検索エンジンがどういう検索をかけてくるのか分からなかったため意図に反した検索をされたらまずいという意味からで、それさえ分かれば対策はおのずから分かってくると思います。

(1)検索エンジン自らいろんな言語でリクエスをかけてクロールしてくれるの?
(2)クロールの際にCookieは使うの?
(3)POSTメソッドやJavascriptは解釈してくれるの?

あたりがキーだと思うのですが、検索エンジンによっても違ってくるでしょうが、(1)はここで回答をもらったように、ないだろうということだと思います。また、(3)も将来はともかく現状ではまずなさそうです。(2)はどうなんでしょう。分かりませんがあまりなさそうな気がします。というのも、検索した結果を表示する場合に、同じURLなのにブラウザの設定やCookieの内容で結果が違うというのは検索エンジンとしてはよろしくないのでそんなことはしないのではと思います。

実際、検索しても同一のURLに複数の結果が表示されているというのは見たことがありませんし、もしあったとしても開いてみたら内容が違っていたというのでは検索の意味をなさないのではと思います。

つまりは、SEO的な観点からはURLとコンテンツは1対1でなければならないといけないのではないかということです。
だとすれば、Sessionで言語情報を保持するのは良いとしても、クロール時にそれを求めるのは無理で、URLとして区別しないとダメなのではないかと思います。

ただ、インデックスされるか否かということに関して言えば、検索エンジンが辿れればOKというのはいえると思いますので、URLが一意でかつハイパーリンクとしてURLが辿っていけるようになってさえいればおっしゃる通りインデックスはしてくれると思います。

例えば、私のやり方のように全ての内部移動用ハイパーリンクを書き換えるようなことをしなくても、言語切り替え用のハイパーリンクをマスターページに置いて、それをクリックすることで言語を切り替えるようにしておけば多言語ページのクロールは可能ですし、言語情報の保持もCookieでやればそれで問題はないと思います。

ただ、両者の違いは、辿れる道筋が違います。
例えば、以下のページがあり、

(1)トップ(Default.aspx)
(2)商品カテゴリ一覧(Products.aspx)
(3)商品カテゴリ内商品一覧をProducts.aspx?c=1(カテゴリIDが1の場合)

とした場合に、単純に言語リンクを設置した場合には各ページの多言語版ページは必ず既定の言語のページ(例えば日本語)からしかリンクされませんので(3)[英語]をクロールするためには

(1)[日本語]→(2)[日本語]→(3)[日本語]→(3)[英語]



ここの部分だけ理解できなかったです。
(1)(2)(3)の画面で共通のマスターページを持ちその中で、言語を切り替えるリンクを持っていた場合には、
(1)[日本語]→<言語変更のリンク>→(1)[英語]→(2)[英語]→(3)[英語]
のパターンも考えられると思ったのですが、私がうまく理解できていないだけかもしれません。

引用:

というリンクを辿ることになります。
検索結果で、サイトの下にインデントした形で下位のページが出てくる場合がありますが、そういう場合だと日本語のページの下に英語が混在して出てくるようになるかもしれません。(未確認)
一方、URLを書き換える場合には、上の経路も含めて複数ありますが、

(1)[日本語]→(1)[英語]→(2)[英語]→(3)[英語]

というのが自然な経路となり、URLをパス形式にした場合にも合致します。そもそも、パス形式とする場合にはURLを書き換える必要がでてくると思いますし。

この経路の違いが検索結果にどのような影響をおよぼすかは分かりませんが、少なくとも後者の方が自然ではあろうと思います。

なお、私も現在進行形なのでどれが正解かというは分かりません。ただ、DotNetNukeという実例があることで全くの手探りではなくある程度方向感はもてているという程度です。



BT様がされている、クエリストリングにより検索エンジンから見たときに
ディレクトリを各言語で持たせる方法が正解なのだろうと思いました。
あとは、実際にやってみるしかないかなと思います。
また私の方で何かわかりましたらフィードバックします。

ほねほね

スキルアップ/キャリアアップ(JOB@IT)