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