PushStateと事前合成を使用する
これを行う現在(2015年)の方法は、JavaScriptのpushStateメソッドを使用することです。
PushStateは、ページをリロードせずに上部のブラウザバーのURLを変更します。タブを含むページがあるとします。タブはコンテンツを非表示および表示し、コンテンツは動的に挿入されます。AJAXを使用するか、単にdisplay:noneおよびdisplay:blockを設定して、正しいタブコンテンツを非表示および表示します。
タブがクリックされたら、pushStateを使用してアドレスバーのURLを更新します。ページがレンダリングされたら、アドレスバーの値を使用して、表示するタブを決定します。Angularルーティングはこれを自動的に行います。
事前構成
PushStateシングルページアプリ(SPA)をヒットするには2つの方法があります。
- ユーザーがPushStateリンクをクリックし、コンテンツがAJAX処理されるPushStateを介して。
- URLを直接押す。
サイトの最初のヒットには、URLを直接ヒットすることが含まれます。PushStateがURLを更新すると、後続のヒットはコンテンツでAJAXになります。
クローラーはページからリンクを収集し、後で処理するためにそれらをキューに追加します。つまり、クローラーの場合、サーバーへのすべてのヒットは直接ヒットであり、Pushstateを介してナビゲートすることはありません。
Precompositionはサーバーからの最初の応答に、おそらくJSONオブジェクトとして、初期ペイロードをバンドルします。これにより、検索エンジンはAJAX呼び出しを実行せずにページをレンダリングできます。
GoogleがAJAXリクエストを実行しない可能性があることを示唆する証拠がいくつかあります。詳細はこちら:
https://web.archive.org/web/20160318211223/http://www.analog-ni.co/precomposing-a-spa-may-become-the-holy-grail-to-seo
検索エンジンはJavaScriptを読み取って実行できます
Googleはしばらくの間JavaScriptを解析することができました。それが彼らが最初にChromeを開発した理由であり、Googleスパイダーのフル機能のヘッドレスブラウザーとして機能します。リンクに有効なhref属性がある場合、新しいURLにインデックスを付けることができます。これ以上行うことはありません。
さらにリンクをクリックしてpushState呼び出しをトリガーした場合、ユーザーはPushStateを介してサイトに移動できます。
PushState URLの検索エンジンサポート
PushStateは現在、GoogleとBingでサポートされています。
グーグル
以下は、SEO向けのPushStateに関するPaul Irishの質問に回答したMatt Cuttsです。
http://youtu.be/yiAF9VdvRPw
Googleがスパイダーの完全なJavaScriptサポートを発表します。
http://googlewebmastercentral.blogspot.de/2014/05/understanding-web-pages-better.html
その結果、GoogleはPushStateをサポートし、PushStateのURLをインデックスに登録します。
Googleウェブマスターツールのfetch as Googlebotもご覧ください。JavaScript(Angularを含む)が実行されていることがわかります。
ビング
2013年3月付けのPushState URLのサポートに関するBingの発表は次のとおりです。
http://blogs.bing.com/webmaster/2013/03/21/search-engine-optimization-best-practices-for-ajax-urls/
HashBangs#は使用しないでください。
HashbangのURLは、開発者が事前にレンダリングされたバージョンのサイトを特別な場所に提供することを要求する醜い一時的なギャップでした。これらは引き続き機能しますが、使用する必要はありません。
ハッシュバングのURLは次のようになります。
domain.com/#!path/to/resource
これは次のようなメタタグとペアになります。
<meta name="fragment" content="!">
Googleはこの形式でそれらのインデックスを作成しませんが、代わりに_escaped_fragments_ URLからサイトの静的バージョンをプルして、インデックスを作成します。
Pushstate URLは通常のURLのように見えます。
domain.com/path/to/resource
違いは、Angularが、JavaScriptで処理するdocument.locationへの変更をインターセプトすることでそれらを処理することです。
PushState URLを使用したい場合(そしておそらく使用する場合)は、古いハッシュスタイルのURLとメタタグをすべて削除し、構成ブロックでHTML5モードを有効にします。
サイトをテストする
Googleウェブマスターツールには、URLをグーグルとしてフェッチし、グーグルがそれをレンダリングするときにJavaScriptをレンダリングできるツールが含まれるようになりました。
https://www.google.com/webmasters/tools/googlebot-fetch
AngularでのPushState URLの生成
#接頭辞の付いたURLではなく、Angularで実際のURLを生成するには、$ locationProviderオブジェクトにHTML5モードを設定します。
$locationProvider.html5Mode(true);
サーバ側
実際のURLを使用しているため、すべての有効なURLについて、同じテンプレート(およびいくつかの事前構成されたコンテンツ)がサーバーから出荷されることを確認する必要があります。これを行う方法は、サーバーアーキテクチャによって異なります。
サイトマップ
アプリは、ホバーやスクロールなど、通常とは異なるナビゲーション形式を使用する場合があります。Googleがアプリを操作できるようにするには、アプリが応答するすべてのURLの簡単なリストであるサイトマップを作成することをお勧めします。これをデフォルトの場所(/ sitemapまたは/sitemap.xml)に配置するか、ウェブマスターツールを使用してGoogleに通知できます。
とにかくサイトマップを作成することをお勧めします。
ブラウザのサポート
PushstateはIE10で動作します。古いブラウザでは、Angularは自動的にハッシュスタイルのURLにフォールバックします
デモページ
次のコンテンツは、事前構成されたpushstate URLを使用してレンダリングされます。
http://html5.gingerhost.com/london
確認できるように、このリンクでは、コンテンツがインデックスに登録され、Googleに表示されています。
404および301ヘッダーステータスコードの提供
検索エンジンはすべてのリクエストに対して常にサーバーにアクセスするため、サーバーからヘッダーステータスコードを提供し、Googleにそれらを表示させることができます。