pushState
コンテンツを読むために検索エンジンが必要だとしたら、それは悪いことですか?
いいえ、この話pushState
は、ハッシュバングと同じ一般的なプロセスを達成することを目的としていますが、見栄えの良い URL を使用します。ハッシュバングを使用すると実際に何が起こるか考えてみてください...
あなたは言う:
ハッシュバンを使用すると、Google は escaped_fragment URL にアクセスして静的コンテンツを取得することを知っています。
言い換えれば、
- 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
にプッシュしたときにクライアント アプリが変換される URL で同じコンテンツを提供します/blog
。(Facebook はpushState
私が知っていることをまだ使用していませんが、ハッシュバングでこれを行います)
Twitter のアプローチ — すべての着信 URL を同等の hashbang にリダイレクトします。つまり、「/blog」へのリンクが/blog
状態にプッシュされます。しかし、直接リクエストされた場合、ブラウザは#!/blog
. (Googlebot の場合、これは必要に応じてルーティングさ_escaped_fragment_
れます。他のクライアントの場合はpushState
、きれいな URL に戻ることができます)。
それで、あなたはで_escaped_fragment_
能力を失いpushState
ますか?
いくつかの異なるコメントで、あなたは言った
エスケープされたフラグメントは完全に異なります。テーマのない純粋なコンテンツやキャッシュされたコンテンツを提供でき、通常のページのような負荷をかけずに済みます。
理想的な解決策は、Google が JavaScript サイトを作成するか、pushstate サイト (robots.txt?) でもエスケープされたフラグメント URL があることを認識する何らかの方法を実装することです。
あなたが言及した利点は、に限定されていません_escaped_fragment_
。それがあなたのために書き換えを行い、特別な名前のGET
パラメーターを使用することは、実際には実装の詳細です。標準の URL ではできない特別なことは何もありません。つまり、mod_rewriteまたはサーバーの同等のものを使用して独自に書き換える/blog
ことができます。/?content=/blog
サーバー側のコンテンツをまったく提供しない場合はどうなりますか?
URL を書き換えて、ある種のコンテンツを/blog
(またはブラウザにプッシュした状態で)提供できない場合、サーバーは実際には HTTP コントラクトを順守していません。
ページをリロードすると (何らかの理由で) この URL のコンテンツがプルされるため、これは重要です。( https://wiki.mozilla.org/Firefox_3.6/PushState_Security_Reviewを参照— 「view-source と reload は両方とも、新しい URI がプッシュされた場合にそのコンテンツをフェッチします。」)
クライアント側で一度ユーザー インターフェイスを描画し、JS API を介してコンテンツをロードすることが悪い目標というわけではありません。HTTP と URL で実際に説明されておらず、基本的に下位互換性がないというだけです。
現時点では、これがまさにハッシュバングの目的です。つまり、サーバーではなくクライアントでナビゲートされる個別のページ状態を表すことです。たとえば、リロードは同じリソースをロードし、ハッシュ値の読み取り、解析、および処理を行うことができます。
たまたま、ページを更新せずに履歴をサーバー側の場所に変更するために (特に Facebook や Twitter で) 使用されています。pushState のハッシュバングを放棄することを人々が推奨しているのは、これらのユースケースです。
すべてのコンテンツをクライアント側でレンダリングする場合は、pushState
ハッシュバンを使用しない方法ではなく、より便利な履歴 API の一部と考える必要があります。