リンク先読みの FAQ

リンクの先読みとは?

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

HTTPS でも先読みしますか?

Gecko 1.9.1 (Firefox 3.5) 以降から HTTPS コンテンツも先読みできます。

先読みのヒントとは?

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 節で説明されています。

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

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

<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 を現在準備中です。

この手法の標準化は HTML5 の範囲の一部です。現在のワーキングドラフトの section §5.11.3.13. Link type "prefetch" を参照してください。

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

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

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

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

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

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

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

はい。http:// (と Gecko 1.9.1 からは https:// )URL だけが先読み可能です。(FTP などの)その他のプロトコルはクライアントサイドのキャッシュへの対応が十分でありません。

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

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

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

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

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

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

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

X-moz: prefetch

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

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

はい。リンクの先読み機能を無効化できる隠し設定があります。 あなたのプロファイルディレクトリにある prefs.js ファイルに次の行を追加してください(もしくは、about:config 経由で変更してください)。

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

しかし、リンクの先読み機能を無効にしたいという場合には、この先読みの実装に何か不具合があるのではないかと思います。我々としては、不具合がある場合には、ユーザーに設定ユーザーインターフェイスの中から目立たない設定項目を探させて変更させるよりも、実装を改善したいと思っています。

ネットワーク回線を従量制課金で使っている人たちについてはどうですか?

基本的には、この問題は二つの観点から見ることができます。ウェブサイトでは既に JavaScript や DOM 等の小技を使って、暗黙のダウンロードが行われていること。先読みはブラウザーの機能の一つであり、ユーザーが簡単に無効化できるようにしておくべきだということです。

ウェブサイトで JavaScript や DOM の色々な小技を使用して暗黙にダウンロードをどんどん進めようとする代わりに、 <link> タグを使った先読みを採用してもらうことが重要です。 <link> タグにより、ブラウザーはどのサイトが最新であるかを知ることができ、文書の先読みの優先順序をより良く付けることができます。ユーザー設定で <link> タグによる先読みを無効化できるようにすると、単に JavaScript や DOM による小技を推奨させることにつながり、ユーザーにとって良い結果にはなり m 差円。先読み機能が既定で有効なのは、このためです。

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

Mozilla 1.2 以降ベースおよび Mozilla 1.0.2 以降ベースのブラウザーが先読み機能に対応しています。これには Netscape 7.01 以降と Phoenix ビルドも含まれます。 2003 年 3 月現在の Chimera ビルドは Mozilla 1.0.1 ベースですので、先読み機能に対応していません。あなたのブラウザーがリンクの先読みに対応しているかどうかテストできます。

プライバシーとの関わり

参照元と URL の追跡との関係はすでに上記で説明されているとおりであり、先読みは一般的に先読みサイトの Cookie へのアクセスを引き起こします。(例えば、 amazon を Google で検索するとき、 Google の結果ページは www.amazon.com google.co.jp で検索した場合は www.amazon.co.jp を先読みし、ブラウザーに Cookie が送られてきます。 Firefox で サードパーティの Cookie をブロックするには、Disabling third party cookies を参照してください。)

他には...?

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

関連情報...

Prefetching Hints

原文情報

  • 著者: Darin Fisher (darin at meer dot net)
  • 最終更新日: Updated: March 3, 2003