- PR -

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

投稿者投稿内容
BT
ベテラン
会議室デビュー日: 2006/09/24
投稿数: 81
お住まい・勤務地: Tokyo
投稿日時: 2008-02-16 12:55
お世話になります。
ここがふさわしいのかどうか迷いましたが、
一応ASP.NETの話題ということで。

以前、ASP.NET多言語化について質問(参照記事)をしたことがあります。
まだ試行錯誤の段階ですが、リソースファイルを使う方法を試しています。

リソースを書き換える方法もわかってきたので、
多言語ページを作って書き換えたりを試しているのですが、
そこでひとつ疑問が湧いてきました。

ブラウザの設定によって自動的に言語を切り替える方式というのは
非常に便利なのですが、検索エンジンのロボットから見た場合には
一体どう見えるのだろうということです。

検索エンジンによって動作が違うのかもしれませんが、
たとえば、英語と日本語のページを用意していた場合、以下の動作が考えられます。

(1)自動的に両方の言語を検索してくれる
(2)優先言語なしで要求してきて、既定の日本語が検索される
(3)英語を優先言語として要求してきて、日本語は検索されない

もし3だとしたら多言語化はかえって仇となってしまいますので、
自動ではなく手動選択方式にした方がよいのかもしれません。
そのあたり、まず事前に確認が必要かなと思って質問させてもらいました。

言語の自動選択は、
リクエストのAccept-Languageヘッダのカルチャを見て
リソースの切り替えを行うということなので、
要はロボットのAccept-Languageヘッダが何を送ってくるのか
ということになるのでしょうが、
IISログを見てもそのあたりは取得されていないので、
もし、やるとしたら検索エンジンから検索されているサイトに
情報収集するコードを仕込んでおくということになるのでしょうが、
多少なりともリスクがある作業なので、
ご存知の方がいればアドバイスいただければありがたいです。

よろしくお願いします。
OakBow
ベテラン
会議室デビュー日: 2007/09/15
投稿数: 51
投稿日時: 2008-02-17 00:57
検索エンジン最大手のGoogleがメインターゲットになると思いますが、
GooglebotはAccept-Language送らないみたいですね。
なので2番の動作になるのかな?

MSその他のグローバルサイトのように、ページ内に他言語版ページの
リンクがある場合はそちらも探しに行くでしょうから、人間とBotが
辿りやすいように通り道をつけてあげておけば、そちらも見てくれる
んじゃないでしょうか?

Googleの検索結果自体には、多言語ページの場合ブラウザのAccept-Language
を見て、その言語にあったページを表示している、って感じの説明が
あるので、リンクさえあればちゃんとインデックス作ってくれそうですけれど。

ASP.NETの話題と言うよりSEOの話になると思うので、そちら関連で
調べてみるといいかもしれません。
個人的に、このような真っ当な技術論もあるのでしょうけれど、いかにして
Botをだますかの話題ばっかり先行している気がする分野ですが。。
BT
ベテラン
会議室デビュー日: 2006/09/24
投稿数: 81
お住まい・勤務地: Tokyo
投稿日時: 2008-02-17 02:49
OakBowさん、どうもありがとうございます。

なるほど、ということは何もしなければ
既定の言語(日本語)のみ検索ということですか。
もしかして自動で各言語の要求をかけてくれる・・なんてことも期待したのですが、
さすがにそれはないでしょうね。

でも多言語化するからには日本語以外でも検索をかけて欲しいので、
何らかの対策をしないといけないということになります。

ちなみに、質問をアップした後、試しに手動選択できるようにと、
DropDownListなどで言語選択をするのを試そうとしてちょっと躓いているところですが、
このやり方については本題から外れるので止めておきます。

で、OakBowさんから頂いたアドバイスのように、人間やロボットが辿りやすいように
工夫しようかなと思っているのですが、上でやろうとしていた
DropDownList等のPostBackが発生するコントロールでそれを行うと、
POSTメソッドのため、検索エンジンは辿ってくれないのでは?
というのが気になりました。

他のサイトではどうやっているのかと思ってグローバルサイトの代表としてMSDN
http://msdn2.microsoft.com/
にアクセスしてみたところ、何らかの方法で言語を自動選択してから
http://msdn2.microsoft.com/ja-jp/default(en-us).aspx
にリダイレクト。その後は、どうやらルートの直下のカルチャ名で
切り替えをしているように見えます。
でも、トップページに辿りやすいリンクを設置しているのかといえば、
言語選択の箇所はあるものの、LinkButton(?)で実現している模様。
ん〜これだとロボットは辿れないのでは?と思いますが、
考えてみればMSDNは自サイト内部や世界中のBLOGなどから
ハイパーリンクが貼られまくっているわけだから特にSEO対策なんて
考えなくてもいいのかもしれません。

また、マイクロソフトのサイト
http://www.microsoft.com/
だと、自動切換えはなしで、ユーザが自分で選択するようになっているようですが、
こちらはDropDownListなのでやはりPOSTメソッド。

やっぱり有名サイトはあまり参考にならないかもしれません。
となるとHyperLinkを使って、URLのクエリー文字等で切り替えるのが
一番辿りやすくてよさそうな気がします。
これだとクエリー文字の解析コードとかを仕込んでおかないと
いけなくなってしまうことになりますが、これが一般的な方法なのでしょうか?

とりあえず、Googleのアクセス方法は教えていただいたので
今後、これに合った対処方法を色々と試行錯誤してみたいと思います。
どうもありがとうございました。
OakBow
ベテラン
会議室デビュー日: 2007/09/15
投稿数: 51
投稿日時: 2008-02-17 14:25
中の人に聞いて見なきゃわかんないですけれど、真っ当なSEO対策くらいは
MSサイトもやってるようは気はしますけどねえ。
そこまで熱心ではないような気はしないでもないですけれど。
熱心そうなAmazonはドメインから違いますね。。
例えばURLに?とか含んでいるとBotのクロール頻度が恐ろしく低下する
ので/ばっかりつかった拡張パス情報で対応するってことはどこも
やってますし。この対応は別に検索エンジンだけを意図したものでは
ないですけれど。。

>他のサイトではどうやっているのかと思ってグローバルサイトの代表としてMSDN
>http://msdn2.microsoft.com/
>にアクセスしてみたところ、何らかの方法で言語を自動選択してから

これこそAccept-Languageでやってるでしょう。

http://www.studyinghttp.net/negotiation#Server-driven_Negotiation

Varyヘッダとかは特に返してないみたいですけれど。

Accept-LanguageをUserAgentが吐いていない場合は、もしかしたら
300 Multiple Choicesを返すくらいはやっているかもしれません。
http://www.studyinghttp.net/status_code#Code300

こうしておけば多言語対応ページなのはBotさえ対応していれば読み取れそう
なので、Googlebotもそのあたりはうまくやってくれてるんじゃないかなあ?


他に多言語対応やってるサイトで有名どころだと、Apacheのマニュアルとか。
http://httpd.apache.org/docs/2.2/
きちんとVaryヘッダ返してます。
オーソドックスな多言語対応ページとしてはこちらの方が参考になるかも
しれませんね。
http://httpd.apache.org/docs/2.2/content-negotiation.html
にApacheでのコンテンツネゴシエーションの仕組みが書かれており、マニュアル
ページもおそらくこの仕組みで動いていると思われます。
最適なリソースが見つからなかった場合は406 Not Acceptable返しているようです。
http://www.studyinghttp.net/status_code#Code406

300返すよりこっちの方がやりやすそうかなあ?

Apacheのことを知らないとわかりにくい部分もありそうですが、説明の大部分は
RFCに則った真っ当な処理の仕組みに終始しているので、一番参考になるかな?
という気がします。

ちなみにDropDownListなどを使うとJavaScriptが実行されると思いますが、
検索エンジンのBotプログラムはJavaScriptを解釈できません。

どの検索エンジンも、どのようにページにアクセスしてインデックスを作成
していくか、基本的な仕組みやポリシーを公開していたと思います。
Googleだとそれがどこにあるのかちょっと見つけられなかったんですが、
コンテンツネゴシエーションについても解説されているかもしれないので、
そちらも目を通しておくとよろしいかと。
私も上っ面の知識と憶測で回答しているだけなので。。
BT
ベテラン
会議室デビュー日: 2006/09/24
投稿数: 81
お住まい・勤務地: Tokyo
投稿日時: 2008-02-21 18:02
OakBowさん、どうもありがとうございます。
遅くなってすみませんでした。

なるほど、色々あるんですね。
まだまだ勉強しなければいけないことが多そうです。
参考に挙げていただいたサイト等をちゃんと理解できるようにするには
規格なども読んでおかないといけないようです。
なお、最終的には検索エンジンがどのようなリクエストを投げてくるか、
また、どういった検索をするかは、実際のデータを収集するしかないのだろう
と思いますので、そのうち、自分のサイトに調査用のコードを仕掛けてやってみたいと思います。

ところで、教えていただいたapacheのマニュアルのページを見ると、
URLにもカルチャ名を入れた上で、言語選択において、
それらのURLに対してHyperlinkを設定しているようですね。
SEO的にはやはりこれが正しいやり方と思われます。
そのあたりを参考に実現方法を検討してみたいと思います。

なお、やりかけていたDropDownListによる明示的な言語切り替えをやってみて、
ようやくできるようになりました。
ただ、URLが同じだと、キャッシュの設定をしてしまうと、
即時に言語が切り替わらないという問題があってどうしようかと思案中ですが、
URLを言語によって変えるのにはこういう意味もあるのだろうか?と思っています。

ASP.NETというよりはSEO的な話題になってしまったので、
そのあたりはまた別スレッドにしたいと思います。

いろいろと教えて頂きどうもありがとうございました。
骨骨★Rock!
常連さん
会議室デビュー日: 2007/09/11
投稿数: 38
投稿日時: 2008-08-21 11:10
お世話になっております。
過去のスレッドにレスする形がふさわしくないのかもしれませんが、
BT様が対応された結果をもしよろしければご教授いただければ幸いです。
ふさわしくない場合には自分で別スレを立てたいと思います。

私も現在、リソースファイルで言語を切り替える方法で
英語/日本語のサイトを運営しておりますが、ヤフーアメリカ
など自分のサイトが英語でインデックスされておりません。
もちろん米ヤフーへの検索エンジン登録申請は行いました。

言語の切り替えはマスターページ上のImageButtonにより行っているのですが、
HyperLinkに変える事でうまく日本語と英語の両方でインデックスしてくれる
のでしょうか?
自分で試す事もできるのですが、現在日本語サイトのインデックスに影響が
あると困るので、恐縮ですがこちらのスレッドに投稿させて頂きました。

宜しくお願いいたします。
BT
ベテラン
会議室デビュー日: 2006/09/24
投稿数: 81
お住まい・勤務地: Tokyo
投稿日時: 2008-08-26 14:12
ご指名のようですが、しばらくHTMLコーディングばかりであまりプログラミングはしておらず、こちらもあまり見てなかったので気付きませんでした。

最近また多言語化について取り掛かり始めたので参考までに書いてみます。試行錯誤段階ですので、あまり参考にはならないかもしれませんけども。

私の現時点での多言語の実現方法としては、ブラウザの設定による自動言語選択から手動選択方式に切り替えました。なお、リソースファイルも使っていますが、データベースにもテーブルに言語列を追加し、リソースとデータベースのハイブリッド?方式としています。

その上で、マスターページに言語選択用のハイパーリンクを設置し、リンクにはクエリ文字(例:/Default.aspx?ln=ja-JP)を付加することで明示的に言語情報を付加するようにします。こうしておけば(実サイトで確認はしていませんが)当然検索エンジンもたどってくれるはずです。(実際にはクエリ文字ではなくパスに置換した方がよさそうですが。例:/ln/ja-JP/Default.aspx)

ただ、この方式だとサイト内部の移動に使用する全てのハイパーリンクの生成時にクエリ文字を解析して言語情報を付加してやる必要がありますので、その処理をするためにサイトを大幅に作りかえる必要が出てきます。今はそのあたりの作り変えをしているところです。もっと簡単な方法があればいいのですが、今のところこれくらいしか思いつきませんでした。

参考になりましたでしょうか。

なお、この多言語化もそうですが、ASP.NETは、SEOなどを考えるとインターネット公開サイトの場合にはポストバックを使わない手法をとらざるを得ない場合が多く、PostBack+ViewStateによるメリットが失われがちです。今後出てくるASP.NET MVCはPostBack+ViewStateではないということなので、もしかするとインターネット公開サイトの場合はASP.NET MVCの方が向いているのかもしれません。(まだ分かりませんがモバイルWebフォームの後継にあたるものもMVCで実現されるのではないかという気がします)
以上は余談でした。
骨骨★Rock!
常連さん
会議室デビュー日: 2007/09/11
投稿数: 38
投稿日時: 2008-08-27 17:36
BT様、
ご回答いただきましてありがとうございます。
もうそろそろ別スレッドを立てた方がよいかと思っていた所に回答を
頂けたのでラッキーでした。

引用:

ご指名のようですが、しばらくHTMLコーディングばかりであまりプログラミングはしておらず、こちらもあまり見てなかったので気付きませんでした。

最近また多言語化について取り掛かり始めたので参考までに書いてみます。試行錯誤段階ですので、あまり参考にはならないかもしれませんけども。

私の現時点での多言語の実現方法としては、ブラウザの設定による自動言語選択から手動選択方式に切り替えました。なお、リソースファイルも使っていますが、データベースにもテーブルに言語列を追加し、リソースとデータベースのハイブリッド?方式としています。


ブラウザの設定による自動言語選択から手動選択方式に切り替えられたとはどういう
意味でしょうか?
Request.UserLanguages[0]からユーザーの言語情報をひらってこないのですか?
ご教授いただけると助かります。

引用:

その上で、マスターページに言語選択用のハイパーリンクを設置し、リンクにはクエリ文字(例:/Default.aspx?ln=ja-JP)を付加することで明示的に言語情報を付加するようにします。こうしておけば(実サイトで確認はしていませんが)当然検索エンジンもたどってくれるはずです。(実際にはクエリ文字ではなくパスに置換した方がよさそうですが。例:/ln/ja-JP/Default.aspx)



なるほど、クエリーストリングの言語を変えて自分自身にリダイレクトして言語を切り替えていらっしゃるのですね。
#やばい、クエリ文字からパスに変換する方法調べないと(汗


引用:

ただ、この方式だとサイト内部の移動に使用する全てのハイパーリンクの生成時にクエリ文字を解析して言語情報を付加してやる必要がありますので、その処理をするためにサイトを大幅に作りかえる必要が出てきます。今はそのあたりの作り変えをしているところです。もっと簡単な方法があればいいのですが、今のところこれくらいしか思いつきませんでした。

参考になりましたでしょうか。



hyperLink.NaviageUrl ="targetPage.aspx?ln=" +Request.QueryString["ln"].ToString()
のようなイメージでしょうか?

こうする事によって、ブラウザから見たときにja-JPと例えば英語の場合は、en-USの2つのディレクトリがあるように見えるという事ですか?

質問ばかりですみません(汗
ご教授いただけると幸いです。


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