pushStateとSEO


80

多くの人が、ハッシュバンではなくプッシュステートを使用すると言っています。

私が理解していないのは、ハッシュバンを使用せずに検索エンジンにどのように対応できるかということです。

おそらく、pushStateコンテンツはクライアント側のJavaScriptコードによって生成されます。

したがって、シナリオは次のようになります。

私は上にいexample.comます。ユーザーがリンクをクリックします:href="example.com/blog"

pushStateはクリックをキャプチャし、URLを更新し、どこかからJSONファイルを取得し、コンテンツ領域にブログ投稿のリストを作成します。

ハッシュバンを使用すると、Googleはescaped_fragmentURLにアクセスして静的コンテンツを取得することを認識しています。

pushStateを使用すると、JavaScriptコードを使用してJSONをロードし、続いてテンプレートを作成できないため、Googleは何も認識しません。

私が見ることができる唯一の方法は、サーバー側でテンプレートをレンダリングすることですが、それはアプリケーション層をクライアントにプッシュする利点を完全に打ち消します。

だから私はこれを正しく理解していますか、pushStateはクライアントサイドアプリケーションにとってSEOフレンドリーではありませんか?


将来の読者への注意:この質問は廃止されましたGoogleの公式声明を読んでください-要するに、googlebotは今すぐJSをサポートしています。
mik01aj 2016

回答:


17

URLにハッシュバンを入れたくない人のためにGoogleが提案するメタタグを使用するのはどうですか? <meta name="fragment" content="!">

詳細については、こちらをご覧ください:https//developers.google.com/webmasters/ajax-crawling/docs/getting-started

残念ながら、ニコールはOPが抱えていると思っていた問題を明確にしたとは思いません。問題は、ハッシュバンを使用しないと、コンテンツを誰に提供しているかわからないということです。Pushstateはこれを解決しません。エンドユーザーに、フォーマットされていないJSONを吐き出すURLに移動するように検索エンジンが指示することは望ましくありません。代わりに、AJAXを介してデータを取得し、希望する方法でユーザーに提示するURL(より多くのURLへの他の呼び出しをトリガーする)を作成します。ユーザーが人間でない場合は、代わりにhtmlスナップショットを提供して、検索エンジンが人間のユーザーを、要求されたデータを見つけると予想されるURLに適切に誘導できるようにします(そして見栄えのする方法で)。しかし、最終的な課題は、ユーザーのタイプをどのように判断するかです。はい、おそらく使用できます。htaccessか、検出した検索エンジンボットのURLを書き換えるための何かですが、これがどれほど完全で将来性があるかはわかりません。グーグルがこの種のことをしたことで人々にペナルティを科す可能性もあるかもしれませんが、私はそれを完全に調査していません。したがって、(pushstate + googleのメタタグ)コンボが解決策のようです。


3
@NickC、わかりました。では、JSを使用せずに最初にコンテンツを表示する方が、より良い解決策だと思います。ただし、JSの上部(ページが読み込まれてDOMの準備ができた後)で、最初に表示されたHTMLコンテンツを非表示にするか、JS拡張機能に置き換えるためのコードをすぐに実行します。たとえば、jqueryデータグリッドを使用しているので、最初にHTMLテーブルを表示してから、すぐにJSをロードして、表示される通常の表形式データをJSグリッドバージョンに変換/非表示/置換します。その後、その時点から、他のajaxリクエストは、pushstateを介して更新されるURLとペアになっているJSONとして提供できます。
プログラムハンマー2012

提案したソリューションの使用経験はどうですか?Googleはこの「一時的な」HTMLにインデックスを付けましたか?関連するグーグル検索に正しく表示されますか?また、最初のHTMLページがJSによって生成されたhtmlで「更新」されるため、エクスペリエンスが少し「ぎこちない」という意味ではありませんか?
ナイルシュケール2014

@NileshKaleこれが私が作り上げた解決策であり、それは仕事を非常にうまく達成します:stackoverflow.com/questions/22824991/…。HTMLテーブルとjqgridを(HTMLの内容と同等の)JSONで渡すだけです。SEOはHTMLを読み取り、ユーザーはajaxを介してアップグレードされたエクスペリエンスとその後のすべてのリクエストを取得します。pushstateを使用すると、ユーザーがグリッドを並べ替え/ページングする方法に基づいてURLを更新できます(ハッシュバンは必要ありません)。これにより、ユーザーはURLを保存して、同じ結果に戻ることができます。
プログラムハンマー2014年

私は数日以内に私の答えを編集してよりよく説明しようとします。
プログラムハンマー2014年

1
AJAXクロールスキームは非推奨になりました:developers.google.com/webmasters/ajax-crawling/docs/…。それを使用するサイトを変更することをお勧めします:plus.google.com/+JohnMueller/posts/LT4fU7kFB8W
プロテクター

97

であるpushStateあなたがあなたのコンテンツを読むために検索エンジン必要があれば悪いですか?

いいえ、話pushStateはハッシュバングと同じ一般的なプロセスを達成することを目的としていますが、見栄えの良いURLを使用しています。ハッシュバンを使用すると実際に何が起こるかを考えてください...

あなたは言う:

ハッシュバンを使用すると、Googleはescaped_fragmentURLにアクセスして静的コンテンツを取得することを認識しています。

つまり、言い換えれば、

  1. Googleはへのリンクを見ています example.com/#!/blog
  2. Googleのリクエスト example.com/?_escaped_fragment_=/blog
  3. あなたは、ユーザーが見るべきコンテンツのスナップショットを返します

ご覧のとおり、すでにサーバーに依存しています。 サーバーからコンテンツのスナップショットを提供していない場合は、サイトのインデックスが適切に作成されていません。

では、GoogleはpushStateで何かをどのように見るのでしょうか?

pushStateを使用すると、javascriptを使用してjsonをロードし、その後テンプレートを作成できないため、googleは何も表示しません。

実際、Googleはで要求できるものは何でも見るでしょうsite.com/blog。URLは引き続きサーバー上のリソースを指し、クライアントは引き続きこの契約に従います。もちろん、最近のクライアントの場合、Javascriptは、ページを更新せずにコンテンツを取得して操作するための新しい可能性を開きましたが、契約は同じです。

したがって、意図されたエレガンスはpushState、古いものと新しいもの、JS対応であるかどうかにかかわらず、すべてのユーザーに同じコンテンツを提供することですが、新しいユーザーは拡張されたエクスペリエンスを取得します。

どのようにしてGoogleにあなたのコンテンツを見てもらうのですか?

  1. Facebookのアプローチ—状態にsite.com/blogプッシュ/blogしたときにクライアントアプリが変換するのと同じコンテンツをURLで提供します。(FacebookはpushState私が知っていることをまだ使用していませんが、ハッシュバンでこれを行っています)

  2. 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の一部として考える必要があります。


3
@ハリー-私の答えの残りを読みましたか?URLはURLであり、リソースロケーターを意味します。サーバーはコンテンツがに存在すると信じていますsite.com/blogか?そうでない場合は、検索エンジンには存在しません。の目的pushStateは、それを回避することではありません。便宜上です。Hashbangsもこれを修正せず、JSで生成されたコンテンツのスナップショット_escaped_fragment_持っているサーバーに依存する複雑な回避策です(通常のユーザーが見るように)。 実際には、これらすべてを単純化します。pushState
ニコール

1
@ Harry-URLがクライアント側のコンテンツを提供するように設計されるまで、URLはサーバー上のリソースを参照し、クライアントはボットを含め、そのように扱います。クライアントで可能な限り多くのことを行うという目標が無効であるという意味ではありませんが、当面は(醜い)ハッシュバンを使用して達成する必要があるかもしれません。私はあなたのユースケースのために私の答えを更新しました。
ニコール2011年

1
@Harryまず第一に、私はグーグルが彼らが何をするのかを言うだけで_escaped_fragment_、あなたが具体的に何をしているのかわかりません。しかし、グーグルが言っていることから、そのクエリパラメータを見たとき、あなたはサーバーによってある種のコンテンツを提供しているに違いないと思います。あなたの場合、それはいくつかのトリックを必要としますが、あなたはいくつかのコンテンツまたは何か他のものを提供し、それからJSにあなたが望むページを構築させることができます。または、ボットを検出して、意図的にまったく異なるコンテンツを提供することもできます。<noscript>/blog
ニコール

2
もう一度、正解と最良の答えが正解として選ばれません...悪い、悪い。

1
次のようなリンクが<a href="product/productName" onclick="showProduct(product)">A product</a>あり、onclickが「preventDefault()」で始まる場合、AJAXlyは製品に関する新しいコンテンツをページにロードし、リンク「... / product / productName」が次のバージョンをロードすることを確認します。サーバーからの応答に特定の製品コンテンツが含まれるページ---したがって、サイトは引き続き動的に機能しますが、製品リンクに直接アクセスすることで静的コンテンツを利用できますか?このようにpushStateやhashbangは必要ありませんね。
Yuval A. 2014

1

pushStateとについての興味深い話はすべて#!、元の投稿者が尋ねているように、pushStateが#!の目的をどのように置き換えるのかまだわかりません。

#!もちろん、99%のJavaScriptベースのAjaxサイト/アプリケーションをSEOableにするためのソリューションを使用しています。クライアントのレンダリングはHTML、JavaScript、PHPを介して行われるため、ページのランディングによって制御されるローダーで次のロジックを使用します。HTMLファイルはJavaScriptとPHPから完全に分離されています。これは、両方で同じHTMLが必要なためです(ほとんどの場合)。JavaScriptとPHPはほとんど同じことを行いますが、JavaScriptははるかに豊富なユーザーエクスペリエンスであるため、PHPコードはそれほど複雑ではありません。

JavaScriptはjQueryを使用して、必要なコンテンツをHTMLに挿入します。PHPはPHPQueryを使用して必要なコンテンツをHTMLに挿入します-「ほぼ」同じロジックを使用しますが、PHPバージョンはSEOableリンクを含むSEOableバージョンを表示するためにのみ使用され、JavaScriptバージョンのように操作されないためはるかに単純です。

ページを構成する3つのコンポーネント、page.htm、page.js、page.phpはすべて、エスケープされたフラグメントを使用してJavaScriptバージョンの代わりにPHPバージョンをロードするかどうかを知るために存在します。PHPバージョンは、SEO不可能なコンテンツ(ユーザーのログイン後にのみ表示されるページなど)には存在する必要はありません。すべてが簡単です。

一部のフロントエンド開発者が、サーバー側のテクノロジーをブラウザーのテクノロジーと組み合わせて使用​​せずに、優れたサイト(Googleドキュメントの豊富さを備えた)を開発する方法にまだ戸惑っています...もちろん、PHPが配置されていないと何も起こりません。

JavaScriptが有効になっている場合は、PHPで提供されるページにアクセスしてJavaScriptバージョンにリダイレクトするための適切なURLを設定できますが、ユーザーがより重要なオーディエンスであるため、ユーザーの観点からは適切ではありません。

ちなみに。JavaScriptなしで機能できる単純なウェブサイトを作成している場合、静的にレンダリングされた単純なコンテンツからより良いものにユーザーエクスペリエンスを段階的に強化したい場合は、pushStateが役立つことがわかりますが、ユーザーに外出先からの最高の体験... JavaScriptまたはGoogleドキュメントのようなもので書かれた最新のゲームを考えてみましょう。このソリューションでの使用はやや制限されています。サイトの。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.