Cache-Control ヘッダーを作成、またはディレクティブ・鮮度設定・選択した競合を HTTP リクエストを送信せずに解析します。
ブラウザ内でローカルに実行上のパネルはレスポンスポリシーを組み立てます。可視性を選び、鮮度の期間を秒で入力し、必要なディレクティブにチェックを入れて「ヘッダーを作成」を押します。このページが送信するヘッダーが「レスポンスヘッダー」欄に表示され、その下に3行の概要(ディレクティブ数、レスポンスの鮮度、保存を許可するキャッシュの範囲)と、組み合わせに含まれる競合が並びます。下のパネルは逆方向の作業です。レスポンスや CDN の設定、ログからコピーした値を貼り付けて「ヘッダーを解析」を押すと、同じ概要がそのテキストについて表示されます。どちらもこのブラウザ内で動作し、ページはオフラインでも使えます。
Cache-Control は、キャッシュに「レスポンスをいつまで再利用してよいか」「再利用の前に何を確認すべきか」を伝える HTTP レスポンスフィールドです。max-age と s-maxage はブラウザと共有キャッシュの期間を決め、no-store は保存を禁止し、no-cache は保存を許すものの検証を必須にし、immutable、stale-while-revalidate、stale-if-error がそれを細かく調整します。このツールは RFC 9111 に沿ってヘッダーのテキストを読み、キャッシュがどう解釈するかを示します。URL には一切アクセスしないため、本番のサーバー、CDN、ブラウザキャッシュが実際にどう動くかまでは分かりません。
public と private は矛盾します。public は共有キャッシュによる保存を許し、private はまさにその共有キャッシュに保存を禁じるため、どちらかを外す必要があります。no-store は最も強いディレクティブで、何も保存できません。同じヘッダーに max-age や s-maxage、古い内容を返す期間があっても意味がなく、概要は適用されない期間を表示する代わりにその点を指摘します。s-maxage を読むのは共有キャッシュだけで、private はそれを排除するため、private と並んだ s-maxage は効果がありません。
immutable は鮮度がある間リソースが変わらないことを約束します(RFC 8246)。max-age も s-maxage もない場合、その約束が及ぶ鮮度の期間が示されていません。must-understand は no-store と一緒に使うもので、そのステータスコードのキャッシュ要件を理解するキャッシュは no-store の部分を無視します(RFC 9111 5.2.2.3)。鮮度期間がない場合も報告します。max-age、s-maxage、no-cache のいずれもないと、キャッシュはヒューリスティック(一般に Last-Modified からの経過時間の10分の1)で判断し、オリジンに問い合わせずに再利用することがあります。
max-age、s-maxage、stale-while-revalidate、stale-if-error は delta-seconds を取ります。RFC 9111 では1桁以上の数字と定義され(1.2.2)、0 は有効で「直ちに古い」を意味し、小数点は文法に含まれません。max-age="5" のように引用符で囲んだ値は、送信側がトークン形式を使う必要があるため報告します(5.2.2.1)。2147483647 秒を超える値も指摘します。その数値を表現できないキャッシュは 2147483648 秒(68 年以上、実質いつまでも新鮮)として扱う必要があるためです。
このフィールドのもう一つの引数形式は、no-cache と private の引用符付きフィールド名リストです(例:no-cache="Set-Cookie")。引用符の中のカンマはリストの一部なので、解析器は引用符の外のカンマだけで分割し、その値を1つのディレクティブとして数えます。キャッシュが認識しないディレクティブはそのキャッシュに無視されます(5.2.3)。だからこそ maz-age=60 のような打ち間違いを報告します。レスポンスはそのまま配信され、ルールだけが存在しない状態になるからです。
このページはリクエストを送信せず、ヘッダーのテキストだけを読みます。CDN、リバースプロキシ、ブラウザがこのフィールドに従うかどうかは、そのシステムの設定とレスポンスのステータスコード次第です。また、ディレクティブが何もないレスポンスでも、ヒューリスティックにキャッシュ可能と判断されれば保存されることがあります。ポリシーは実際のレスポンス(curl -I、CDN が示すキャッシュヘッダー、ブラウザのネットワークパネル)で確認してから信用してください。
このフィールドの隣接項目は対象外です。Expires は期間ではなく絶対日時を示し、Pragma は HTTP/1.0 のリクエストフィールドで RFC 9111 では非推奨です(5.4)。そのため別のフィールド名で始まる行は、Cache-Control と勝手に読み替えず拒否します。そして確認はテキストに対するものなので、きれいに読めるヘッダーでも内容に対して誤っていることがあります。静的アセットへの no-store、毎時変わるページへの1年の max-age は、ヘッダー検査では判断できない設計上の選択です。