であるpushState
あなたがあなたのコンテンツを読むために検索エンジン必要があれば悪いですか?
いいえ、話pushState
はハッシュバングと同じ一般的なプロセスを達成することを目的としていますが、見栄えの良いURLを使用しています。ハッシュバンを使用すると実際に何が起こるかを考えてください...
あなたは言う:
ハッシュバンを使用すると、Googleはescaped_fragmentURLにアクセスして静的コンテンツを取得することを認識しています。
つまり、言い換えれば、
- Googleはへのリンクを見ています
example.com/#!/blog
- Googleのリクエスト
example.com/?_escaped_fragment_=/blog
- あなたは、ユーザーが見るべきコンテンツのスナップショットを返します
ご覧のとおり、すでにサーバーに依存しています。 サーバーからコンテンツのスナップショットを提供していない場合は、サイトのインデックスが適切に作成されていません。
では、GoogleはpushStateで何かをどのように見るのでしょうか?
pushStateを使用すると、javascriptを使用してjsonをロードし、その後テンプレートを作成できないため、googleは何も表示しません。
実際、Googleはで要求できるものは何でも見るでしょうsite.com/blog
。URLは引き続きサーバー上のリソースを指し、クライアントは引き続きこの契約に従います。もちろん、最近のクライアントの場合、Javascriptは、ページを更新せずにコンテンツを取得して操作するための新しい可能性を開きましたが、契約は同じです。
したがって、意図されたエレガンスはpushState
、古いものと新しいもの、JS対応であるかどうかにかかわらず、すべてのユーザーに同じコンテンツを提供することですが、新しいユーザーは拡張されたエクスペリエンスを取得します。
どのようにしてGoogleにあなたのコンテンツを見てもらうのですか?
Facebookのアプローチ—状態にsite.com/blog
プッシュ/blog
したときにクライアントアプリが変換するのと同じコンテンツをURLで提供します。(FacebookはpushState
私が知っていることをまだ使用していませんが、ハッシュバンでこれを行っています)
Twitterのアプローチ—すべての受信URLを同等のハッシュバンにリダイレクトします。言い換えれば、「/ blog」へのリンク/blog
は状態にプッシュします。ただし、直接要求された場合、ブラウザはで終了し#!/blog
ます。(Googlebotの場合、これは_escaped_fragment_
必要に応じてルーティングされます。他のクライアントの場合はpushState
、きれいなURLに戻ることができます)。
それで、あなたは_escaped_fragment_
能力を失いpushState
ますか?
いくつかの異なるコメントで、あなたは言った
エスケープされたフラグメントは完全に異なります。純粋なテーマのないコンテンツ、キャッシュされたコンテンツを提供でき、通常のページのような負荷にさらされることはありません。
理想的な解決策は、GoogleがJavaScriptサイトを実行するか、プッシュステートサイト(robots.txt?)に対してもエスケープされたフラグメントURLがあることを知る何らかの方法を実装することです。
あなたが言及した利点は、に分離されていません_escaped_fragment_
。書き換えを行い、特別な名前のGET
パラメータを使用することは、実際には実装の詳細です。あなたは、標準のURLを行うことができなかったということについては本当に特別なものは何もありません-つまり、書き換え/blog
に/?content=/blog
使用して、独自にmod_rewriteをしたり、サーバの同等のものを。
サーバー側のコンテンツをまったく提供しない場合はどうなりますか?
URLを書き換えて、ある種のコンテンツを/blog
(またはブラウザーにプッシュした状態で)提供できない場合、サーバーは実際にはHTTPコントラクトに準拠していません。
ページのリロード(何らかの理由で)はこのURLのコンテンツをプルするため、これは重要です。(https://wiki.mozilla.org/Firefox_3.6/PushState_Security_Reviewを参照してください—「ビューソースとリロードはどちらも、プッシュされた場合、新しいURIでコンテンツをフェッチします。」)
クライアント側で一度ユーザーインターフェイスを描画し、JS APIを介してコンテンツを読み込むことが悪い目標であるというわけではありません。それは、HTTPとURLで実際に考慮されておらず、基本的に下位互換性がないということです。
現時点では、これはハッシュバンが意図されている正確なことです—サーバーではなくクライアント上でナビゲートされる個別のページ状態を表すためです。たとえば、リロードは同じリソースをロードし、ハッシュ値の読み取り、解析、処理を行うことができます。
たまたま、ページを更新せずに履歴をサーバー側の場所に変更するために(特にFacebookやTwitterで)使用されていることもあります。 人々がpushStateのハッシュバンを放棄することを推奨しているのはこれらのユースケースです。
すべてのコンテンツをクライアント側でレンダリングする場合pushState
は、ハッシュバンを使用する方法ではなく、より便利な履歴APIの一部として考える必要があります。