web-dev-qa-db-ja.com

この応答がキャッシュされるのはなぜですか?

現在、サイトのindex.htmlにこれらのヘッダーが返されているクライアントがいます。

Accept-Ranges:bytes 
 Connection:Keep-Alive 
 Content-Encoding:gzip 
 Content-Length:3658 
 Content-Type:text/html 
日付:2013年10月10日(木)07:36:27 GMT 
 ETag: "4aa95e1-2ed2-4e721324728b7" 
 Keep-Alive:timeout = 5、max = 100 
最終変更日:2013年9月24日火曜日13:34:30 GMT 
サーバー:Apache/2.2.22 
 Vary:Accept-Encoding、User-Agent

必要に応じてExpiresまたはCache-Controlを追加することをお勧めしますが、混乱します:Chromeはこのリソースをキャッシュし、キャッシュから使用します(リクエストを送信しません) at)、数時間後でも(たとえば、昨日の午後8時30分にキャッシュされたコピーを再利用しました)。これは、Chromeコンソールの[ネットワーク]タブで非常に明確に確認できます。このタブでは、リクエストが表示され、Status列と(from cache)200 (OK)がグレーで表示されますサイズ列。 (Chromeのキャッシュのデフォルトは変更していません。)

私は、ヘッダーからの方向の不在で、仕様 ユーザーエージェントが独自の決定を行うことを許可する であることを認識しています。ここで何が起きているのですか? Chromeは、それが数日前に最後に変更されたことを確認し、(たとえば)最新ではないバージョンを自由に使用できますか?それとも私が見逃しているものがありますか?

31
T.J. Crowder

「Expires」および「Cache-Control」ヘッダーが指定されていないが、「Last-Modified」ヘッダーisが指定されている場合、ブラウザーはどのように推測する必要があるか長い間、ドキュメントをキャッシュに保持する必要があります。一部のブラウザdoは、ページを1日以上キャッシュに残すアルゴリズムを使用します。

Googleキャッシュのベストプラクティスガイド 状態:

Last-Modifiedは、ブラウザがヒューリスティックを適用してキャッシュからアイテムを取得するかどうかを決定するという点で、「弱い」キャッシュヘッダーです。 (ヒューリスティックはブラウザによって異なります。)


Mozilla(Firefox)にはHTTPキャッシングFAQがあります この状況のアルゴリズムの概要を示しています(ドキュメントの2002年以降にアルゴリズムが変更された可能性があります)。

...「Last-Modified」ヘッダーを探します。このヘッダーが存在する場合、キャッシュのフレッシュネスライフタイムは、「Date」ヘッダーの値から「Last-modified」ヘッダーの値を10で除算した値に等しくなります。

そのため、変更後と現在の違いが15日間の場合、Firefoxはリソースを1.5日間キャッシュします。

すべての主要なブラウザは、Firefoxが実装するのと同じ10%ルールを使用しているようです。 これらのヒューリスティックを要求するStackOveflowで質問されました 。ブラウザーごとに異なる回答があるため、それらはすべて同様の実装を持っています。 Internet ExplorerとWebkit(ChromeとSafari)に対する回答があります。


ブラウザのキャッシュのサイズ は、おそらくキャッシングアルゴリズムが1日以上保持されると判断するファイルの制限要因になります。通常、ブラウザにはキャッシュに使用するディスク容量の設定があります。多くのユーザーは、ブラウザーを閉じるときにキャッシュもクリアします。そのため、このようなファイルがキャッシュされる時間は通常、次の要素に依存します。

  • ブラウザが割り当てたキャッシュスペースの量
  • ユーザーがアクセスするWebサイトの数(およびそれらのサイトのサイズ)
  • ユーザーがブラウザを閉じたかどうか
33