CF-Cache-Status ヘッダーは、リソースがキャッシュされているかどうかを示します。このヘッダーが返すキャッシュレスポンスを調べるには、Redbot ↗、webpagetest.org ↗、または視覚的なツールである Cloudflare Optics plugin ↗ を使います。
以下は、Cloudflare のキャッシュレスポンスステータスの一覧です。
リソースが Cloudflare のキャッシュで見つかりました。
レスポンスはキャッシュ対象ですが、リクエスト時点では Cloudflare のキャッシュになく、オリジン Web サーバーから返されました。Cloudflare がキャッシュしないと判断したレスポンスは、MISS ではなく BYPASS になります。
Cloudflare が、アセットがキャッシュ対象外であることを示すレスポンスを生成しました。次のような場合に発生します。
-
Worker がサブリクエストを送らずにレスポンスを生成した。この場合、レスポンスはキャッシュから来ていないため、キャッシュステータスは
none/unknownになります。 -
Worker のリクエストがサブリクエスト(
fetch)を行った。この場合、サブリクエストにはキャッシュステータスが記録され、メインリクエストはnone/unknownになります(Worker はキャッシュの手前にあるため、メインリクエストはキャッシュに当たりません)。 -
WAF カスタムルールがリクエストをブロックした。レスポンスはキャッシュに到達する前に Cloudflare のグローバルネットワークから返されます。キャッシュステータスがないため、Cloudflare は
none/unknownとして記録します。 -
リダイレクトルール または Always Use HTTPS により、グローバルネットワークが別のアセット / URL へのリダイレクトを返した。このリダイレクトはリクエストがキャッシュに到達する前に起きるため、キャッシュステータスは
none/unknownです。
リソースは Cloudflare のキャッシュで見つかりましたが、期限切れで、オリジン Web サーバーから返されました。
リソースは期限切れですが、Cloudflare のキャッシュから返されました。Cloudflare は更新済みリソースを取得するためにオリジン Web サーバーへ接続できませんでした。
Cloudflare はリクエスト時点でアセットをキャッシュ対象と見なしました。デフォルトでキャッシュされるファイル拡張子 に一致するか、Cache Rule でキャッシュが有効になっていたためです。ただし、最終的にオリジンのレスポンスはキャッシュできませんでした。
オリジンレスポンスがキャッシュ不可と判断される主な理由は次のとおりです。
- レスポンスが、ご利用プランの キャッシュ可能な最大ファイルサイズ を超えている。
- オリジンが
Cloudflare-CDN-Cache-ControlまたはCDN-Cache-Controlヘッダーでno-storeまたは単独のprivateを返した。Cloudflare はこれらのヘッダーをCache-Controlより先に評価します。優先順位はCloudflare-CDN-Cache-Control>CDN-Cache-Control>Cache-Controlです。そのため、オリジンがCache-Control: public, max-age=3600とCDN-Cache-Control: no-storeを同時に返すとBYPASSになります。Cache Rule でオリジンの cache-control を無視する Edge Cache TTL を設定している場合は、これらのディレクティブは上書きされます。Cache-Control: no-storeの場合と同じです。これらのヘッダーのno-cache、max-age=0、s-maxage=0ではBYPASSになりません。最初のリクエストはMISS、その後はREVALIDATEDまたはEXPIREDになります。優先順位のルールは CDN-Cache-Control を参照してください。 - オリジンが
Cache-Control: no-storeまたはprivateを返した。これらのディレクティブは、Origin Cache Control のどちらのモードでもキャッシュを妨げます。 - オリジンが
Cache-Control: no-cache、max-age=0、またはs-maxage=0を返し、Origin Cache Control が無効(Enterprise プランのデフォルト)である。Origin Cache Control が有効な場合(Free、Pro、Business プランのデフォルト)は、これらのディレクティブにより Cloudflare はレスポンスをキャッシュして再検証するため、REVALIDATEDまたはEXPIREDになります。no-storeとno-cacheディレクティブの理解 と Conditions の表を参照してください。 - オリジンが
Set-Cookieヘッダーを返した。BYPASSになる具体的な設定はSet-Cookieレスポンスヘッダーと Cache の相互作用 を参照してください。 - オリジンが
Vary: *レスポンスヘッダーを返した。この場合は常にキャッシュをバイパスします。 - リクエストに
Authorizationヘッダーがあり、Origin Cache Control が有効(Free、Pro、Business プランのデフォルト)である。このモードでは、Cache-Controlにpublic、s-maxage、またはmust-revalidateも含まれている場合にのみキャッシュできます。Origin Cache Control が無効な Enterprise プランでは、Authorizationだけではキャッシュを妨げません。
BYPASS は、キャッシュしない判断が レスポンス時点 で行われたことを意味します。リクエストは当初キャッシュ対象でしたが、オリジンのレスポンスまたはレスポンスヘッダーにより、Cloudflare はキャッシュしないよう指示されました。たとえば、"cache": true を設定する Cache Rule はリクエスト時点でキャッシュを有効にしますが、オリジンが Cache-Control: no-store を返すと、レスポンスは BYPASS になります。
キャッシュされるはずの URL で BYPASS が出る場合は、キャッシュされないレスポンスの調査 で手順に沿って切り分けてください。
オリジンが条件付きリクエスト(If-Modified-Since または If-None-Match)で、キャッシュ済みリソースに変更がないことを確認し、レスポンスは Cloudflare のキャッシュから返されます。このステータスは同期的な検証パスを表します。リクエストは、オリジンの応答を待ってから返されます。
非同期の stale-while-revalidate では、ほとんどの再検証は UPDATING または HIT を返します。REVALIDATED が見られるのは次の場合です。stale-while-revalidate が設定されていない。または must-revalidate や no-cache(Origin Cache Control が有効な場合)などのディレクティブにより、古いコンテンツの提供が禁止されている。
リソースは期限切れですが、オリジンがバックグラウンドで更新しているあいだ、Cloudflare のキャッシュから返されました。UPDATING は、非同期の stale-while-revalidate による再検証中の想定ステータスです。再検証ウィンドウ中のリクエストは、オリジンを待たずに UPDATING または HIT を受け取ります。
Cloudflare はリクエスト時点でアセットをキャッシュ対象外と判断したため、キャッシュ参照なしでオリジン Web サーバーへリクエストが送られました。
次のような場合に発生します。
- リクエストされたアセットが デフォルトでキャッシュされるファイル拡張子 ではなく(HTML や JSON など)、キャッシュするルールもない。
- Bypass cache 設定の Cache Rule がリクエストに一致する。Configuration Rules または Page Rules のレガシーオプション
Cache Level: Bypassも同じ動作です。 - ゾーンで Development Mode が有効になっている。キャッシュは 3 時間停止します。
Cloudflare がキャッシュする内容を変えるには Cache Rules を使います。リクエストがキャッシュ対象になると、CF-Cache-Status ヘッダーはレスポンス時点のキャッシュ判断(HIT、MISS、EXPIRED、REVALIDATED、BYPASS など)を反映します。オリジンレスポンスが最終的にキャッシュできない場合は BYPASS を参照してください。
リクエストがキャッシュ対象になるはずなのに DYNAMIC が出る場合は、キャッシュされないレスポンスの調査 を参照してください。