ブラウザキャッシュ

ブラウザキャッシュを有効にするにあたり、調べたことをメモ。

基本概念

http://www.studyinghttp.net/caching#explicit_expiration_time は必読。特に以下4つ。

明示的有効期限 {explicit expiration time}

オリジンサーバが、エンティティの有効性の再確認無しにキャッシュを返すべきではないとしている時刻。

帰納的有効期限 {heuristic expiration time}

有効期限が指定されていない時に、キャッシュによって指定される有効期限。

経過時間 {age}

レスポンスの経過時間とは、それがオリジンサーバから送られてから、あるいはオリジンサーバによって十分に有効性が確認された時からの時間を指す。

有効期間 {freshness lifetime}

レスポンスが生成されてから有効期限までの時間の長さ。

キャッシュ期限モデル

オリジンサーバがキャッシュの有効期限を定め、それを越えたキャッシュはオリジンサーバにそのキャッシュとしての正当性・有効性を確認しない限りはキャッシュとして使えないというもの。有効期限には、オリジンサーバによって明示的に示される明示的有効期限の他に、帰納的有効期限がある。

オリジンサーバは明示的有効期限を示すのが望ましい。

Expires/Pragma/Cache-Controlヘッダ

キャッシュ制御するためにHTTP/1.0で定められたヘッダがExpiresとPragma。HTTP/1.1ではより細かく制御をするために、Cache-Controlヘッダが定められた。

Expiresヘッダ

レスポンスがfreshでなくなると考えられる日付/時刻を表すレスポンスヘッダ

Pragmaヘッダ

具体的に定義されたのはPragma: no-cacheのみ。no-cache 指示子がリクエストメッセージ中にある時は、キャッシュがfreshであっても、オリジンサーバに向けてリクエストを転送する。

Cache-Controlヘッダ

キャッシュに対して、その振る舞いを決定するための指示子を記述する。Cache-ControlはExpiresやPragmaに優先する。

まとめ

HTTP/1.1が実装されているHTTPサーバであれば、Cache-Controlヘッダを設定しておけばOKなことがわかった。ブラウザに1時間キャッシュさせるためには、Cache-Control: max-age=3600と書けばよい。