ブラウザキャッシュメカニズム(1)


ブラウザキャッシュメカニズムの1つ(クラシックキャッシュ)
引き継いだプロジェクトでは比較的新しいHTML 5アプリケーションキャッシュが使われていたため、max-age、Etagなどの古典的なキャッシュも使われていたが、これまではその原理を深く研究していなかった.週末は天気が悪くて、出かけるのがおっくうで、ちょうど時間を見つけてまとめました.
1.ブラウザキャッシュについて
去年「HTTP権威ガイド」を見たとき、ブラウザのキャッシュに特化した章があったのを覚えています.1年が早すぎて、過ぎ去った時間は本当に人ごみの中で消えた良い娘のようで、彼女が他の人と結婚するのを見ていました.ここでは、ブラウザキャッシュをクラシックなブラウザキャッシュ(以下、クラシックキャッシュと略称する)とHTML 5アプリケーションキャッシュの2つに分類します.
古典的なブラウザキャッシュは、Cache-Control(max-age指定ドキュメントが新鮮な秒数を設定する)、Pragma(Pragmaは主にHTTP 1.0、HTTP 1.1はCache-Control)、Expires(相対秒数ではなく期限切れの絶対日付を指定するため、推奨されません)、Etag、Last_Modified.ここでEtagはリクエストヘッダのIf_に対応するNone_Match(INMと略記)、Last_Modified対応If_Modified_Since(IMSと略記).新しいHTML 5アプリケーションキャッシュは、ドキュメントをオフラインで格納することをサポートし、ドキュメントのデータがオフラインで効率的になり、トラフィックを節約し、モバイル側で多く使用されます.
2.クラシックキャッシュ
デフォルトでは、html、ピクチャ、cssなどのドキュメントの内容に対してapacheは応答にEtagおよびLast_を追加します.Modified.これにより、次回のリクエスト時にINMおよびIMSが持ち込まれ、ドキュメントの内容が変更されていない場合は304 Not Modifiedに戻り、キャッシュから前にキャッシュされたファイルを取り出すことができる.ドキュメントがその時点から変更された場合は、200とドキュメントの新しい内容を返します.次に、cache−control、expires、INMおよびIMSの効果をそれぞれapacheで試験する.
2.1 Cache-ControlとExpires
私のapacheバージョンは2.4.10で、以下のように構成されています.htmlファイルのCache-ControlとExpiresを設定し、Last-Modified応答ヘッダとEtagを無効にしました.
FileETag none
<Files *.html>
    Header set Cache-Control "max-age=3600"
</Files>
ExpiresActive On
ExpiresByType text/html A20
<Files *>
    Header unset Last-Modified
</Files>

私のindexhtmlファイルは次のとおりです.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>       </title>
</head>
<body>
<p>    </p>
<img src="/test.gif">    </img>
</body>
</html>

これによりhtmlファイル応答にcache-control応答ヘッダが設定され、以下のようになります.
Accept-Ranges:bytes
Cache-Control:max-age=3600
Connection:Keep-Alive
Content-Length:29
Content-Type:text/html
Date:Mon, 09 Mar 2015 14:17:20 GMT
Expires:Mon, 09 Mar 2015 14:18:20 GMT
Keep-Alive:timeout=5, max=100
Server:Apache/2.4.10 (Ubuntu)

では、応答ヘッダにはCache-controlとExpiresがあり、この2つの値がわざと設定されているのとは異なり、このときどの値を基準にしているのでしょうか.chromeの下での実験結果は、Cache-controlの優先度が高いことを示している.すなわち、使用期間が新鮮期間3600秒未満である場合、アドレスバーでindexにアクセスする.htmlページの場合はそのままキャッシュから取り出します.
ここでchromeに問題があるのは、同じtabの下でindexにアクセスするということです.htmlは、期限が切れているかどうかにかかわらず、キャッシュから取り出されません.新しいtabアクセスを開くと、キャッシュメカニズムが有効になります.具体的な原因は不明ですが、chrome内部キャッシュポリシーと関係がある可能性があります.例えば、ここで同じ質問をする人がいます.
2.2 Last-MOdified/If-MOdifid-SinceとEtag/If-None-Martch
これらのマークはCache-Controlと組み合わせて使用できます.-Last-Modified:応答ドキュメントの最終変更時間を示します.-If-MOdified-Since(IMS):Cache-Controlで指定されたmax-ageを超える使用期間など、ドキュメントが期限切れになった場合、そのレスポンスドキュメントにLast-MOdifiedのレスポンスヘッダがある場合、リクエスト時にIMSヘッダが付けられ、サーバドキュメントの最終変更時間になります.
  • Etag:webサーバが要求に応答すると、Etagヘッダに戻って、ブラウザにドキュメントがサーバに一意に表示されていることを通知します.apacheにおけるEtagは,ファイルのInode,サイズおよび最終修正時間mtimeをhashしたものである.
  • If-None-Martch(INM):ドキュメントが期限切れになると、ブラウザリクエストはINMヘッダを持ち、内容はEtag値です.Webサーバは、Etagの値よりも304を返すか200を決定する.

  • 2.1の構成についてFileTag noneおよび<Files *>
    Header unset Last-Modified
    </Files>
    を注釈すると、EtagおよびLast−MOdified応答ヘッダがオンになります.
    要求ヘッダにIMSとINMの両方が存在する場合、サーバはINMを優先的に検証し、INMマッチングが成功した後にのみIMSの比較を継続します.
    2.3既存IMS何生INM
    http権威ガイドの上の説明によると、IMSが存在するのは主に以下のいくつかの理由がある.-一部のドキュメントは周期的に書き換えられる可能性があるが、実際に含まれているデータは常に同じである.内容は変更されていませんが、変更日は変更されます.-一部のドキュメントは変更される可能性がありますが、変更は重要ではありません.世界的な成都へのデータの再ロードは必要ありません.-ページの最終変更時間を正確に判断できないサーバもあります.-一部のサーバが提供するドキュメントはミリ秒で変化しますが、このサーバに対して秒単位で変更する日付は十分ではありません.
    3.ユーザーの動作とキャッシュ
    ユーザーの動作は、ブラウザキャッシュメカニズムにも影響します.例えば、F 5はExpires/Cache-controlを無効にし、CTRL+F 5(一部のシステムではShift+F 5)を使用すると、Expires/Cache-controlのほかにEtag/Last-modifiedが無効になります.
    4.参考資料
  • ブラウザキャッシュメカニズム
  • 『HTTP権威ガイド』
  • Is Chrome ignoring Control-Cache: max-age?