ディレクティブの意味を並べ、ブラウザと CDN それぞれの新鮮期間と矛盾を出します
Cache-Control の値を入れると、ディレクティブの意味と矛盾がここに出ます。
Cache-Control はカンマ区切りのディレクティブの並びです。順番に意味はなく、書いた順に評価されるわけでもありません。効き方は「誰に対する指示か」で決まります。max-age はすべてのキャッシュに、s-maxage は共有キャッシュ(CDN・プロキシ)だけに効き、only-if-cached のようにリクエスト側でしか意味を持たないものもあります。応答ヘッダにリクエスト用のディレクティブを書いても無視されるだけで、警告は出ません。
このツールは、ブラウザのキャッシュと共有キャッシュを分けて新鮮期間を計算します。Age ヘッダを入れると、そこから何秒残っているかも出します。Age は、その応答が中継のキャッシュに入ってから何秒経ったかを表す値です。
| 書き方 | 実際に起きること |
|---|---|
no-store, max-age=60 | no-store が勝つ。60秒の指定は意味を持たない |
public, private | 意味が正反対。どちらが勝つかは実装依存 |
no-cache, max-age=600 | 毎回オリジンへ確認が入るので、600秒は実質効かない |
private, s-maxage=300 | 共有キャッシュは保存しないので、s-maxage の宛先が無い |
max-age=1h | 整数でないので属性ごと無視される。1時間にはならない |
stale-while-revalidate は、新鮮期間が切れてからの猶予です。この秒数のあいだ、キャッシュは古い応答をすぐ返しつつ、裏でオリジンに取りに行けます。利用者から見ると待ち時間が増えません。stale-if-error は、オリジンがエラーを返したときに古い応答で凌いでよい秒数です。どちらも max-age か s-maxage があって初めて起点が決まります。
解析はすべてブラウザ内で行っています。判定は RFC 9111(HTTP Caching)と、拡張ディレクティブを定めた RFC 5861 に基づいています。
no-cache は保存を許しますが、再利用の前に必ずオリジンへ確認させます。no-store はそもそも保存させません。個人情報を含む応答に付けるべきなのは no-store のほうです。名前から受ける印象と役割が逆になりやすい組み合わせです。
ブラウザは max-age を、CDN やプロキシなどの共有キャッシュは s-maxage を見ます。s-maxage があるとき、共有キャッシュは max-age を無視します。CDN では長く、ブラウザでは短く保持させたいときに使い分けます。
immutable は新鮮なあいだにだけ効きます。max-age が無い、または 0 だと、そもそも新鮮な時間が存在しないため効果がありません。ファイル名にハッシュを含む配信物に、長い max-age と組み合わせて使います。
いいえ。解析はすべてブラウザ内の JavaScript で行います。貼り付けたヘッダがネットワークに出ることはありません。