Visit Mozilla.org

Link prefetching FAQ

出典: MDC

この記事は、Mozilla Japan 翻訳部門もしくはその関連グループによりすでに翻訳済みのものを移行してきました 移行元の文書。英語版と内容が異なる場合や、MDC の他の記事と整合性のとれていない場合があります。


目次

[編集] リンクの先読みとは?

リンクの先読みとはブラウザの機能の一つで、ブラウザのアイドル時間を使って、ユーザが近い将来に訪問するであろう文書をダウンロードして、予め読み込んでおくことを指します。まず、Web ページの方から先読みのヒントをブラウザに渡します。そのページの読み込みが完了すると、ブラウザは黙って指定された文書を先読みし、キャッシュに蓄積しておきます。ユーザが先読みされている文書を訪問すると、ブラウザのキャッシュからすぐに提供できます。

[編集] 先読みのヒントとは?

HTML の <link> タグまたは HTTP の Link: ヘッダにおいて、next, prefetch のいずれかの関係を持つものです。 <link> タグを使う例を以下に示します。

<link rel="prefetch" href="/images/big.jpeg">

同じヒントを HTTP の Link: ヘッダを使って表すと次のようになります。

Link: </images/big.jpeg>; rel=prefetch

Link:ヘッダは HTML 文書中からも HTML の <meta> タグを使って指定できます。

<meta HTTP-EQUIV="Link" CONTENT="</images/big.jpeg>; rel=prefetch">

Link:ヘッダのフォーマットは、 RFC 2068 の 19.6.2.4 節で説明されています。

ヒント: 改訂版の標準 RFC 2616 には Link: ヘッダについての記述が無いため、ここではわざと改訂前の HTTP/1.1 仕様書を参照しています。 Link: ヘッダは、改訂版の標準には無いものの、実際には現在もサーバでの CSS スタイルシートの指定で使われています。そのため、我々はこの機能をここでも使うことにしました。

ブラウザはこれらのヒント全てを元に、ブラウザが使われていない時に先読みするための各リクエストを待ち行列に入れます。一ページに複数のヒントがあれば、複数の文書に対して先読みを行います。例えば、次の文書としていくつかの大きな画像を指定することもあります。

他にも以下のような指定ができます。

<link rel="prefetch alternate stylesheet" title="Designed for Mozilla" href="mozspecific.css">
<link rel="next" href="2.html">

[編集] アンカータグ(<a>)の内容も先読みされますか?

いいえ。 nextprefetch のリンク形式を持つ <link> タグだけが先読みの対象です。しかし、要望が多いようなら、nextprefetch の関係を含む <a> タグのリンクの先読みを将来的にはサポートするようになるかもしれません。そうすれば、コンテンツ提供者が先読みリンクを更新し忘れるという問題を回避しやすくなるでしょう。

[編集] リンクの先読み機能は標準に準拠していますか?

はい。ここで述べているリンクの先読み機能は、既存のウェブ標準に違反していません。実際、HTML 4.01 仕様書では新たなリンク形式の定義は明確に許されています(Section 6.12: Link types を参照)。しかし、Mozilla で採用した手法自体はまだ標準化されていません。 Internet Draft を現在準備中です。

[編集] ブラウザのアイドル時間はどのように判定されますか?

現在の実装(Mozilla 1.2)では、アイドル時間は nsIWebProgressListener API を用いて判定されます。トップレベルの nsIWebProgress オブジェクトにリスナーを追加しました("@mozilla.org/docloaderservice;1")。このリスナーから、文書の開始と停止の通知を受け取って、前の文書の停止と次の文書の開始の間の時間をアイドル時間として概算します。前の文書の停止通知は、大まかに言って、トップレベル文書の onLoad ハンドラが起動した時に行われます。この時が先読みリクエストを行う時になります。サブフレームが先読みのヒントを含む場合にも、先読みは最上位のフレームとその「子」フレームの読み込みが終了するまで始まりません。

[編集] 先読みの取得中に別のリンクをクリックするとどうなりますか?

ユーザがリンクをクリックしたり、何らかの種類のページ読み込みを発生させたりすると、先読みは停止し、先読みのヒントは捨てられます。先読みしている文書が部分的にダウンロードされている場合は、途中までの文書をサーバから送られた "Accept-Ranges: bytes" レスポンスヘッダ付きでキャッシュに蓄積されます。このヘッダは、大抵、ウェブサーバが静的なコンテンツを提供する際に生成するものです。ユーザが先読みした文書を実際に訪問する際には、その文書の残りの部分を HTTP の byte-range リクエストを使って取得します

[編集] バックグラウンドで何かをダウンロードしている場合はどうですか? リンクの先読み機能は回線容量を奪い合いますか?

「イエス」であり、「ノー」でもあります。まず、Mozilla を使って何かをダウンロードしている場合は、全てのダウンロードが終わるまでリンクの先読み機能を遅らせます。例えば、ブックマーク・グループを読み込んでいる(複数のタブを開く)場合には、そのブックマークされたページで発生した先読みリクエストは、全てのタブがロードし終わるまで、開始されません。一方、別のアプリケーションがネットワークを使っている場合は、Mozilla のリンクの先読みはその他のアプリケーションと回線容量を奪い合います。将来的には、ネットワークのアイドル時間を監視するオペレーティングシステムのサービスを利用して、この問題を解決したいと思っています

[編集] 先読みできるものに何か制限はありますか?

はい。http:// URL だけが先読み可能です(https:// URL はセキュリティ上の理由から先読みされません)。(FTP などの)その他のプロトコルはクライアントサイドのキャッシュへの対応が十分でありません。さらに、クエリ文字列付きの URLも先読みされません。なぜなら、このような URL の多くはブラウザのキャッシュを再利用しないような文書であるため、これらの先読みは大抵役に立たないからです。一連の文書群の中で次の文書を参照するために、<link rel="next"> タグにクエリ文字列付きの URL を使っている既存のサイトも現実にはあります。 Bugzilla はこのようなサイトの一例です。 Bugzilla のバグ報告などはキャッシュ可能でないため、これらの URL を先読みすると貧弱な Bugzilla の負荷を倍にしてしまうことになってしまいます! 他のサイトも Bugzilla と同様の設計になっていると容易に想像できますので、クエリ文字列付きの URL は先読みしないことにしました(ただし、rel=prefetch のリンク形式が指定されている文書は既存のコンテンツには存在しないと思われますので、これは先読みしてもよいかもしれません)。先読みされる URL にその他の制限はありません。

[編集] Mozilla は別のホストからも文書を先読みしますか?

はい。先読みには、同一生成元(same-origin)についての制限はありません。リンクの先読みを同一サーバの URL に限定したとしても、ブラウザのセキュリティ向上にはならないでしょうから。

[編集] 先読みのリクエストには Referer: ヘッダが付きますか?

はい。先読みリクエストには、どの文書から先読みヒントを取ったかを示す、HTTP の Referer: ヘッダが付きます。

このことは、多くのサイトで広く行われている参照元の追跡に影響するかもしれません。このため、リンクの先読みは全てのコンテンツに対して向くものではないかもしれません。そこで、Cache-control: must-revalidate HTTP レスポンスヘッダを指定することにより、ユーザが先読みされた文書へのリンクを辿った際に、Mozilla にその先読みされた文書を検証させることができるようにしています。このヘッダが使われると、キャッシュは有効なままですが、ブラウザのキャッシュから文書を取り出す前には、If-Modified-Since もしくは If-None-Match の検証用リクエストが必要になります。

[編集] サーバ管理者ですが、先読みのリクエストを通常のリクエストと区別する方法はありますか?

はい。先読みのリクエストには、次のようなヘッダが付きます。

X-moz: prefetch

もちろん、このリクエストヘッダは全く標準化されていないものですので、将来の Mozilla リリースでは変更される可能性もあります。

[編集] リンクの先読み機能を無効化する設定はありますか?

はい。リンクの先読み機能を無効化できる隠し設定があります。 Mozilla のプロファイルディレクトリにある prefs.js ファイルに次の行を追加してください。

user_pref("network.prefetch-next",false);

この設定用の UI を追加することも考慮中です(bug 166648 をご覧ください)。しかし、リンクの先読み機能を無効にしたいという場合には、この先読みの実装に何か不具合があるのではないかと思います。我々としては、不具合がある場合には、単にユーザに設定 UI の中から目立たない設定項目を探させるよりも、実装を改善したいと思っています。だって、Mozilla の設定 UI はもう十分にごちゃごちゃしているんだもん。 ;-)

更新: 多くの人の要望により、 Mozilla 1.3 以降の UI にリンクの先読みを無効化する設定が入りました。リンクの先読みを無効化するには Preferences->Advanced->Cache 【訳注: 日本語版では 「設定->詳細->キャッシュ」】 をご覧ください。

[編集] ネットワーク回線容量の出費をバイト単位で行っている人たちについてはどうですか?

基本的には、この問題は二つの観点から見ることができます。

  1. ウェブサイトでは既に JavaScript や DOM といった技を使って、無断でダウンロードすることが色々と行われている。
  2. 先読みはブラウザの機能の一つであり、ユーザが簡単に無効化できるようにしておくべきだ。

ず、既存のウェブサイトにおいて、JavaScript や DOM の色々な技を使って黙ってダウンロードする手法を進めていく代わりに、<link> タグを使った手法を採用してもらうことが重要です。 <link> タグにより、ブラウザはサイトの進むべき方向を知ることができます。この情報を使うことによって、文書の先読みの優先順序をより良く付けることができます。 <link> タグによる先読みを無効化するユーザ設定を付けることは、単に JavaScript や DOM による技で我慢させることにつながり、ユーザにとって望ましくない結果になるかもしれません。先読み機能がデフォルトで有効なのは、このためです。

[編集] どのブラウザがリンクの先読み機能に対応していますか?

Mozilla 1.2 以降ベースおよび Mozilla 1.0.2 以降ベースのブラウザが先読み機能をサポートしています。これには Netscape 7.01 以降と Phoenix ビルドも含まれます。 2003年3月現在の Chimera ビルドは Mozilla 1.0.1 ベースですので、先読み機能に対応していません。Test your browser to see if it supports Link Prefetching.

[編集] 他には...?

リンクの先読み機能について質問やコメントなどありましたら、私の方までお気軽にどうぞ。 :-)

[編集] 参考...

Prefetching Hints

[編集] Original Document Information

  • Author(s): Darin Fisher (darin at meer dot net)
  • Last Updated Date: Updated: March 3, 2003