web-dev-qa-db-ja.com

HTML5モードルートを使用してAngularJSサイトをクロールするGoogleボット

HTML5ルートを使用するAngularJSサイトがあります。 「FetchasGoogle」の実行をテストしました。結果は少し紛らわしいです:

  • [フェッチ]タブに、すべてのフロントエンドバインディング{{}}があり、すべてのHTMLがレンダリングされていない、ビューソースで表示されるサイトが表示されます
  • レンダリングタブでは、私たちのサイトは完全に正常に見え、{{}}変数はありません。Googleボットがサイトをフェッチして正常にレンダリングしたようです。これはおそらくこれと一致しています http://googlewebmastercentral.blogspot。 ae/2014/05/rendering-pages-with-fetch-as-google.html

ただし、Googleがサイトをクロールできないようにする準備がすでに整っているため、追加済みです。そのため、Googleボットは「?_escaped_fragment_ =」でページに再度アクセスします。これに従いました https:// developers .google.com/webmasters/ajax-crawling/docs/getting-started (セクション「3.ハッシュフラグメントのないページの処理」)。Nginx構成には次のようなものがあります。

if ($args ~ "_escaped_fragment_=") {
    serve the static HTML snapshots
}

、そして実際、_escaped_fragment_ =を自分で渡せば、問題なく動作します。ただし、Googleボットはこのパラメータを使用してサイトをクロールしようとしたことがないため、スナップショットをクロールしませんでした。私たちは何かが欠けていますか? Nginx confにGoogleボットのエージェント検出も追加する必要がありますか?このようなもの?

if ($http_user_agent ~* "googlebot|yahoo|bingbot|baiduspider|yandex|yeti|yodaobot|gigabot|ia_archiver|facebookexternalhit|twitterbot|developers\.google\.com") {            

server from snapshots

}

これをもっとよく理解できれば幸いです、よろしくお願いします!

更新:
これを読んだばかりです http://scotch.io/tutorials/javascript/angularjs-seo-with-prerender-io?_escaped_fragment_=tag#caveats 。したがって、手動ツール(Fetch as Google)を使用する場合は、どちらかを渡す必要があるようです。または?_escaped_fragment_ =を適切な場所に配置します。実際、この場合に?_escaped_fragment_ =を渡すと、作成したHTMLスナップショットが表示されます。

本当?これは実際にどのように機能するのですか?

UPDATE 2このスレッドの下部で、Googleの従業員は、Googleウェブマスターの「Fetchas Google」の場合、手動で_escaped_fragment_ =パラメータを渡す必要があることを確認します。あなた自身、 https://productforums.google.com/forum/#!msg/webmasters/fZjdyjq0n98/PZ-nlq_2RjcJ

乾杯、
イラクリス

17

HTML5モードでSPAを開発した先月の経験に基づいて、あなたの質問に答えようと思います。

Googlebotで直接リンクの代わりに?_escaped_fragment_ =を使用するにはどうすればよいですか?.

これは実際には非常に単純ですが、見落としがちです。実際、Googlebotにescaped_fragmentを試してもらうには2つの異なる方法があります。最初の方法は、非html5モードでサイトを実行することです。これは、URLが次の形式になることを意味します。

http://my.domain.com/base/#!some/path/on/website

Googlebotは#を認識します!そして、変更されたURLを使用してサーバーに2回目の呼び出しを行います。

http://my.domain.com/base/?_escaped_fragment_=some/path/on/website

その後、必要に応じて処理できます。 Googlebotに_escaped_fragment_モードを試す2つ目の方法は、ボットに提供するインデックスページに次のメタタグを含めることです。

<meta name="fragment" content="!">

これにより、googlebotはタグを確認するたびに他のバージョンのウェブページをチェックします。興味深いことに、これらの両方の手法を一緒に使用することも、メタタグを使用してhtml5モードで実行することで最終的に実行したことを実行することもできます。これは、URLが次のようにエスケープされることを意味します。

http://my.domain.com/base/some/path/on/website?_escaped_fragment_=

興味深いことに、ボットはフラグメントの最後に何も配置しません。ただし、実行しているWebサーバーによっては、「_ escaped_fragment_」テキストに一致するパターンを使用してこれを代替ボットページに簡単にマッピングできます。エスケープされたフラグメントの詳細については、 ここ にアクセスしてください。

「FetchasGooglebot」は、私のページの2つの異なるバージョンを返します。ソースは{{}}で、レンダリングされたページは正しく表示されます。どういう意味ですか?

Googleのボットは2014年の初めから、実際には限られた範囲でJavaScriptを解釈できます。詳細については、Googleウェブマスターの公式ブログエントリをご覧ください こちら 。ただし、ブログエントリで明らかにされているように、これには多くの注意事項があります。例えば:

  1. Googlebotは、すべてのjavascriptコードを実行することを保証するものではありません。
  2. Googlebotは、JavaScript内のリンクを検索して追跡し、それらを使用してさらに多くのページを検索しようとします。
  3. Googlebotは、できるだけ多くのJavaScriptを実行することで、ウェブマスターツールでプレビューをレンダリングします(したがって、レンダリングされたバージョンには{{}}がありません)。
  4. Googlebotは、インデックス用にサイトに関するメタ情報を構築するために、必ずしもレンダリングされたバージョンを使用するわけではありません。

18/12/2014の時点で、Googlebotがリンクを見つける以外にインデックスのレンダリングモードでSPAから実際に情報を抽出できるかどうかはまだわかりません。 javascriptに従ってください。私たちの経験では、Googlebotはインデックスリストに{{}}を含めるため、{{}}を使用してメタ情報(説明、キーワード、タイトルなど)を入力しようとすると、サイトはGoogle検索で次のようになります。結果:

{{meta.siteTitle}}
http://my.domain.com/base/some/path/on/website
{{メタ記述}}

このように見えるかもしれないあなたが期待するものではなく:

ドメイン
http://my.domain.com/base/some/path/on/website
これは私のドメインのランダムなページです。確かに優れたサンプルページです!

8
Katalyst

GoogleBot for Search Engineは_escaped_fragment_を使用していますが、他のサービスについては確信が持てません

Googleは、hashbang(#!)と_escaped_fragment_ paramを使用して、AJAX WebサイトのHTMLスナップショットを提供することをお勧めします。

しかし、多くの場合、新しいGoogle機能については、すべてのGoogleサービスが最初からそれをサポートしているわけではありません。

今のところ、経験上、ウェブページのインデックス作成にGoogleBotはHTMLスナップショットと_escaped_fragment_を使用していると確信しています。サーバーアクセスログをチェックして、Googleがアプリケーションでそれを実行したことを確認できます。

(現時点では、経験上、Googleによる公式なものはありません)PageSpeed Insight、ウェブマスターツールパーサー、リッチスニペットテストツールなどの他のサービス:hasbang(#!)はサポートされていません。 _escaped_fragment_を使用する必要があります。

HTMLスナップショットを提供するためにユーザーエージェント検出を使用する必要がありますか?

いいえ、しないでください。さまざまな理由で:

  1. Web上のどのサービス/ボットがコンテンツを解析したいかわからず、網羅することはできません(たとえば、ボットを使用してコンテンツのスニペットを作成するWeb上に存在するすべてのソーシャルネットワークについて考えてみてください。それらを1つずつ処理しないでください)
  2. これはクローキングと見なすことができます。同じURLでユーザーのタイプに応じて異なるバージョンを提供しますが、これはSEOにとって基本的に間違っています。
1
Ciseur

GoogleはサイトのURLで#!を探し、#!の後のすべてを取得して、_ escaped_fragment _クエリパラメータ。一部の開発者は、実際のデータを使用して基本的なhtmlページを作成し、クロール時にサーバー側からこれらのページを提供します。だから、_ escaped_fragment _を持つサーブ側にPhantomJSを使用して同じページをレンダリングしてみませんか。詳細については、こちらをお読みください blog

0
Rubi saini

少し時代遅れかもしれませんが、完全を期すために:

2014年5月23日からの声明 によると、Googleボットは「最新のWebブラウザのようにコンテンツを見る」ことができるようになりました。

彼らによると 2015年10月14日からの声明 GoogleはAJAXクロールスキームを非推奨にしました。

したがって、HTML5 History API(Angularのhtml5mode)を使用してもGoogleにとって問題はありません。

0
Jan Viehweger