28

13.2.2 ヒューリスティックの有効期限

オリジンサーバーは常に明示的な有効期限を提供するとは限らないため、HTTP キャッシュは通常、ヒューリスティックな有効期限を割り当て、他のヘッダー値 (Last-Modified 時間など) を使用して妥当な有効期限を推定するアルゴリズムを採用します。HTTP/1.1 仕様は特定のアルゴリズムを提供しませんが、結果に最悪の場合の制約を課します。ヒューリスティックな有効期限は意味の透明性を損なう可能性があるため、慎重に使用する必要があり、オリジン サーバーが可能な限り明示的な有効期限を提供することをお勧めします。 HTTP/1.1 RFC 2616

もっともらしい有効期限を推定するためにブラウザーが使用するアルゴリズムは何ですか?

理想的な答えは、ソース コードまたは公式ブログ投稿からの証拠を使用して、すべての主要なブラウザーをカバーすることです。

4

5 に答える 5

22

関心のあるすべてのブラウザーが Internet Explorer 8 以降であると仮定しましょう (たとえば、IE5 にはヘッダーのキャッシュに関するひどい動作があります)。

(HTTP/1.1 で導入された) キャッシングを制御する標準ベースの方法は、Cache-ControlHTTP ヘッダーのみです。

少なくとも 1996 年以来、IE は HTTPS コンテンツのキャッシュにオプトアウト ポリシーを使用してきました。

導入以来、Chrome は HTTPS のオプトアウトを行っているようです (つまり、そうしないように指示されない限り、キャッシュします)。2011 年に Firefox 4 (ただし Safari は除く) は、HTTPS コンテンツのオプトアウト キャッシュに切り替えました。ソース

推奨事項

  1. ブラウザのキャッシュを制御するには、HTTP ヘッダーのみを使用してください。これに反対する場合は、IE は HTML 内で設定された 2 つのキャッシュ制御ディレクティブのみを認識することに注意してください。

    <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
    <META HTTP-EQUIV="Expires" CONTENT="-1">
    

    そして、HTTPS シナリオでは前者だけが役立つようです。さらに、IEで使用しようとすると問題Pragmaが発生する可能性があります。最後に、Chrome はメタ タグ内のキャッシュ ディレクティブを無視し、その有用性をさらに低下させます。

  2. Expiresヘッダーを使用しないでください。最新のブラウザExpiresでは、に取って代わられていCache-Controlます。技術的Expires: 0Pragma: no-cache無効な応答ヘッダーです。はい、それらは最初から存在していましたが、すべての最新のブラウザー (Chrome など) がそれらを使用しているわけではなく、.Cache-Control

  3. Varyヘッダーは地雷原です古い IE での動作VaryXHR での動作方法Vary。詳細を見つけることは、読者の演習として残されています - そして、異なるコンテンツには異なる URL を使用することが望ましいという印象を残します...

  4. を設定して、ブラウザが条件付きリクエストを行えるようにしますETagsEtag を使用すると、ブラウザーはコンテンツが変更されているかどうかを確認するための簡単なチェックを行うことができ、変更されていない場合は完全なリクエストを行うことを避けることができます。

  5. 一部のブラウザは壊れており、ハックが必要であることに注意してくださいIE 8 では、キャッシュしないように指示されたファイルをダウンロードする際に問題が発生する場合があります

ブラウザのキャッシュ アルゴリズム

こちらもご覧ください

于 2015-08-06T09:36:07.730 に答える
11

Chromium のソース コードから: https://code.google.com/p/chromium/codesearch#chromium/src/net/http/http_response_headers.cc&l=1082&rcl=1421094684

  if ((response_code_ == 200 || response_code_ == 203 ||
       response_code_ == 206) && !must_revalidate) {
    // TODO(darin): Implement a smarter heuristic.
    Time last_modified_value;
    if (GetLastModifiedValue(&last_modified_value)) {
      // The last-modified value can be a date in the future!
      if (last_modified_value <= date_value) {
        lifetimes.freshness = (date_value - last_modified_value) / 10;
        return lifetimes;
      }
    }
  }
于 2015-01-14T08:54:42.470 に答える
8

webkit ( 「...Safari で使用されるエンジンの OS X システム フレームワーク バージョン...」)は、Chromium と同じヒューリスティックを使用しているようです。

以下はCacheValidation.cppからの抜粋です。

return (creationTime - lastModifiedValue) * 0.1;
于 2015-01-15T21:01:23.253 に答える
4

Gecko は に有効期限を見積もっnow + (now - lastModified)/10ています。最後に確認しました。

于 2013-01-16T02:52:51.037 に答える