Cloudflare キャッシュ デフォルトのキャッシュ動作

デフォルトのキャッシュ動作

→ Cache Rules がない場合の動作

https://developers.cloudflare.com/cache/concepts/default-cache-behavior/

よくあるのがデフォルトで .html はキャッシュされない点に注意。
また、image/png のような MIME タイプには関係なく、あくまで URL の拡張子ベースでキャッシュするかどうかを判断している点に注意。

Cloudflare キャッシュのデフォルト挙動確認 #cloudflare - Qiita 2021

キャッシュ対象/状態はレスポンスヘッダの cf-cache-status で確認

  • cf-cache-status dynamic / BYPASS キャッシュされない
  • cf-cache-status hit / miss キャッシュ対象

DYNAMICとはコンテンツがキャッシュ対象外でオリジンへ毎回取得に行くことを表します。似たような挙動を行うものとしてBYPASSというものがありますが、これはリクエスト時のCache-Control headerがno-cache,private, max-age=0にセットされたときの挙動です。
つまり、拡張子毎除外されるのがDYNAMIC、リクエスト単位でヘッダーの指定により除外されるのがBYPASSです。
Cloudflare CDNでデフォルトのキャッシュビヘイビアを変更する方法(HTMLをキャッシュさせる)Page Rules 2023

Cloudflareがサーバーのコンテンツをキャッシュするのは4つの条件があります。

  • Cloudflareのネームサーバーを使っている
  • Cloudflareのプロキシを利用している
  • Cloudflareのキャッシュ対象ファイルである
  • オリジンサーバーのブラウザキャッシュTTLが0以上である

この全ての条件が揃っていないとCloudflareはコンテンツをキャッシュしません

Cloudflareのキャッシュについて理解する | SERVERSUS 2020

例えば Apache で ExpiresByType image/jpg "access plus 7 days" を設定

https://github.com/gregrickaby/The-Perfect-Apache-Configuration/blob/master/http.conf

オリジン応答

< HTTP/1.1 200 OK
< Date: Thu, 24 Oct 2024 14:37:40 GMT
< Server: Apache
< Last-Modified: Sat, 01 Aug 2015 08:02:24 GMT
< ETag: "b4eccd9-d459-51c3b5b4d6400"
< Accept-Ranges: bytes
< Content-Length: 54361
< Cache-Control: max-age=604800
< Expires: Thu, 31 Oct 2024 14:37:40 GMT
< Content-Type: image/jpeg

Cloudflare応答 → cf-cache-status: HIT

< HTTP/2 200 
< date: Thu, 24 Oct 2024 14:36:29 GMT
< content-type: image/jpeg
< content-length: 54361
< last-modified: Sat, 01 Aug 2015 08:02:24 GMT
< etag: "b4eccd9-d459-51c3b5b4d6400"
< cache-control: max-age=604800
< expires: Thu, 31 Oct 2024 08:53:52 GMT
< cf-cache-status: HIT
< age: 20559
< accept-ranges: bytes
...

Apache の ExpiresByType が適用されるのは静的ファイルのみ。phpでコンテンツを生成している場合は同じMIMEタイプでも適用されない

mod_expiresが動いていると次の行を追加することでそのMIMEタイプの静的ファイルを転送するときにExpiresヘッダを付加してくれるようだ。
.htaccessからブラウザキャッシュを設定 | tm23forest.com 2020

オリジン Cache-Control ヘッダなし

Cloudflare does cache the resource even if there is no Cache-Control header based on status codes.
https://developers.cloudflare.com/cache/concepts/default-cache-behavior/

オリジン応答

< HTTP/1.1 200 OK
< Date: Mon, 04 Nov 2024 07:52:15 GMT
< Server: Apache
< Last-Modified: Sun, 09 Nov 2014 15:00:00 GMT
< ETag: "bb666d-1007-5076e4ccf3c00"
< Accept-Ranges: bytes
< Content-Length: 4103
< Content-Type: image/png

Cloudflare応答

< HTTP/2 200 
< date: Mon, 04 Nov 2024 08:01:21 GMT
< content-type: image/png
< content-length: 4103
< last-modified: Sun, 09 Nov 2014 15:00:00 GMT
< etag: "bb666d-1007-5076e4ccf3c00"
< cache-control: max-age=14400
< cf-cache-status: HIT
< age: 1266
< accept-ranges: bytes

オリジンで Cache-Control 指定なしの場合
Edge TTL 120m
Browser Cache TTL 4 hours (Caching Configurationで設定)

cache-control: 14400=4hours

Cloudflare の Browser Cache TTL を理解する #cloudflare - Qiita 2024