基本的に一連の連続したページである Web サイトを書いています。非修飾 URL は最後のページを指し、修飾 URL は特定のページを指します。したがって、次のようになります。
- http://example.com/ -> 最後のページ
- http://example.com/3 -> ページ 3
次の要件があります。
- ページが AJAX によって動的に読み込まれるようにします。ユーザーは多くの連続するページを短時間で順番にブラウズする可能性があるため、リロードと再描画を回避したい (そして、ナビゲーションを高速化するために隣接するページの JavaScript プリフェッチを追加する)
- ページをブックマーク可能にしたい
- ページをクロール可能にしたい
- ほとんどのユーザーにとって機能するようにしたい。
そこで、次のスキームを思いつきました。
- アーカイブ ページの標準の正規 URL はhttp://example.com/3です。この URL からアクセスしたページは、JavaScript がインストールされているかどうかに関係なく、完全に読み取り可能です。JavaScript が利用できない場合、他のページへのリンクは通常のリンクであり、すべてが古き良き方法で機能します。これはクローラーにも機能します。
- JavaScript、および履歴操作 (pushState および replaceState) が使用可能なブラウザーがそのような URL にアクセスすると、他のページへのリンクがアクセスされたときにコンテンツが AJAX を使用して動的に更新されます。その後、ブラウザの履歴が JavaScript によって更新されます。
- JavaScript は使用できるが、履歴操作は使用できないブラウザーでサイトにアクセスすると、ユーザーは、http://example.com/3 にアクセスすると、JavaScript を使用してhttp://example.com/#!3 にリダイレクトされます。 . メイン ページhttp://example.comにアクセスしても、リダイレクトは発生しません。その後、ハッシュ変更イベントを使用してナビゲーションが行われます。
- クローラーが外部リンクhttp://example.com/#!3を介してアクセスしようとすると、実際にはhttp://example.com/?_escaped_fragment_=3 ( 1 ) を要求します。このような URL の場合、Web サーバーはhttp://example.com/3への永続的なリダイレクトを発行し、その後正しくクロールされます。
ここではすべて問題ないように見えますが、考えられるすべてのケースを見てみましょう。
1. JavaScript ブラウザなし
1.1。JavaScript ブラウザーがルート URL にアクセスしない
期待どおりに動作します。
1.2. JavaScript ブラウザーが正規 URL にアクセスしない
期待どおりに動作します。
1.3。JavaScript ブラウザーがシバン URL にアクセスしない
黙って失敗!ユーザーは、3 ページ目ではなく最後のページを取得します。
2. クローラー
2.1. クローラがルート URL にアクセス
期待どおりに動作します。
2.2. クローラが正規 URL にアクセス
期待どおりに動作します。
2.3. クローラーがシバン URL にアクセス
クローラーは実際にhttp://example.com/?_escaped_fragment_=3をリクエストし、正規 URL へのリダイレクトを発行します。これは Web サーバーに対する 1 つの追加要求ですが、大したことではありません (データベースから余分なページがフェッチされてユーザーに返されることはありません)。
3.古いブラウザ
3.1. 古いブラウザがルート URL にアクセスする
他のページへのリンクは、それらのシバン バージョンに置き換えられます。ナビゲーションは AJAX によってスムーズに行われます。
3.2. 古いブラウザが正規の URL にアクセスする
ユーザーには、シバン URL へのリダイレクトが発行されます。問題: サーバーは実際にページを 3 回フェッチして提供します!
- http://example.com/3 <- サーバーによって完全に提供されます
- JavaScript はhttp://example.com/#!3へのリダイレクトを発行します
- サーバーはhttp://example.com/のみを認識し、最後のページを提供します
- JSON を使用して (再び) ページ 3 を取得し、ページのコンテンツを置き換えます。
3.3. 古いブラウザーがシバン URL にアクセスする
リダイレクトは必要ありませんが、最後のページに余分な負荷がかかります!
- ユーザーはhttp://example.com/#!3にアクセスします
- サーバーはhttp://example.com/のみを認識し、最後のページを提供します
- JSON を使用してページ 3 を取得し、ページのコンテンツを置き換えます。
4. 最新のブラウザ
4.1. 最新のブラウザはルート URL にアクセスします
4.2. 最新のブラウザは正規の URL にアクセスします
この2つの場合は問題ありません。ナビゲーションは AJAX によって行われ、正規 URL は履歴にプッシュされます。
4.3. 最新のブラウザーがシバン URL にアクセスする
URL は正規 URL に変更されます。コンテンツは AJAX によって読み込まれます。問題は、以前と同様に、最後のページでサーバーからの余分な負荷が発生することです。
要約すると、次のようになります。
- このソリューションは基本的に機能します
- しかし、シバン URL を使用すると、ほとんどの場合、最後のページの不要なロードが発生します。これは、サーバーが最後のページを処理する必要があるかどうか、またはこれが実際にシバン リクエストの一部であるかどうかがわからないためです。
私の質問は、これらの余分なページの読み込みを回避する方法について誰かが良い考えを持っていますか? このような問題を解決するための良い習慣はありますか?