Cache API ↗ を使うと、Cloudflare グローバルネットワーク ↗ のキャッシュへの読み書きを細かく制御できます。
Cache API はグローバルに使えますが、キャッシュの内容は発生元データセンターの外には複製されません。GET /users のレスポンスは発生元データセンターにキャッシュできますが、明示的に作成しない限り、別のデータセンターには存在しません。
カスタムドメインにデプロイした Workers では、cache 操作が使えます。Pages functions も同様で、カスタムドメインと *.pages.dev ドメインのどちらでも使えます。
ただし、Cloudflare Workers ダッシュボードエディターと Playground のプレビューでは、Cache API の操作は効果がありません。Cloudflare Access の手前にある Workers では、現時点で Cache API は利用できません。
caches.default API は、Web ブラウザーの Cache API の影響を強く受けていますが、重要な違いがあります。たとえば、Cloudflare Workers ランタイムは単一のグローバルキャッシュオブジェクトを公開します。
let cache = caches.default;
await cache.match(request);caches.open ↗ メソッドで、追加の Cache インスタンスを作成および管理できます。
let myCache = await caches.open('custom:cache');
await myCache.match(request);Cache API の実装は、put() に渡したレスポンスの次の HTTP ヘッダーを尊重します。
Cache-Control- キャッシュディレクティブを制御します。Cloudflare Cache-Control Directives と一致します。
Cache-Controlディレクティブがない場合の HTTP レスポンスコードと TTL の一覧は、Edge TTL を参照してください。
- キャッシュディレクティブを制御します。Cloudflare Cache-Control Directives と一致します。
Cache-Tag- あとからタグでリソースをパージできます。
ETagcache.match()がIf-None-Matchによる条件付きリクエストを評価できるようにします。
Expires文字列- リソースが無効になるタイミングを指定する文字列です。
Last-Modifiedcache.match()がIf-Modified-Sinceによる条件付きリクエストを評価できるようにします。
Web ブラウザーの Cache API とは異なり、リクエストやレスポンスのヘッダーは尊重されません。
cache.put(request, response);-
put(request, response): Promise- 指定したリクエストをキーとして、レスポンスをキャッシュに追加しようとします。キャッシュへの保存成否にかかわらず、
undefinedに解決する Promise を返します。
- 指定したリクエストをキーとして、レスポンスをキャッシュに追加しようとします。キャッシュへの保存成否にかかわらず、
-
requeststring | Request- キーとなる文字列、または
Requestオブジェクトです。文字列を渡すと、新しい Request オブジェクトの URL として解釈されます。
- キーとなる文字列、または
-
responseResponse- 指定したキーの下に保存する
Responseオブジェクトです。
- 指定したキーの下に保存する
cache.put は、次の場合にエラーをスローします。
- 渡した
requestのメソッドがGET以外です。 - 渡した
responseのstatusが206 Partial Content↗ です。 - 渡した
responseにヘッダーVary: *が含まれます。Varyヘッダーの値がアスタリスク(*)です。詳細は Cache API の仕様 ↗ を参照してください。
Cache-Control がキャッシュしないよう指示している場合、またはレスポンスが大きすぎる場合、cache.put は 413 エラーを返します。
cache.match(request, options);-
match(request, options): Promise<Response | undefined>- そのリクエストをキーとするレスポンスオブジェクトを包んだ Promise を返します。
-
requeststring | Request- 検索キーとして使う文字列、または
Requestオブジェクトです。文字列は、新しいRequestオブジェクトの URL として解釈されます。
- 検索キーとして使う文字列、または
-
options- 取りうるプロパティは
ignoreMethod(Boolean)だけです。trueの場合、実際の値にかかわらずリクエストをGETとして扱います。
- 取りうるプロパティは
ブラウザーの Cache API と違い、Cloudflare Workers は match() の ignoreSearch や ignoreVary オプションをサポートしません。この動作は、put() 時にクエリ文字列や HTTP ヘッダーを除くことで実現できます。
Cache API の実装は、match() に渡したリクエストの次の HTTP ヘッダーを尊重します。
-
Range- 一致するレスポンスに Content-Length ヘッダーがある場合、
206レスポンスになります。レスポンスにAccept-Rangesヘッダーがあってもなくても、Cloudflare のキャッシュは常に range リクエストを尊重します。
- 一致するレスポンスに Content-Length ヘッダーがある場合、
-
If-Modified-Since- 一致するレスポンスに
Last-Modifiedヘッダーがあり、その値がIf-Modified-Sinceで指定した時刻より前の場合、304レスポンスになります。
- 一致するレスポンスに
-
If-None-Match- 一致するレスポンスに
ETagヘッダーがあり、その値がIf-None-Matchのいずれかの値と一致する場合、304レスポンスになります。
- 一致するレスポンスに
要求したコンテンツがない、または期限切れの場合、cache.match は 504 エラーレスポンスを生成します。Cache API はこの 504 を Worker スクリプトへ直接は公開せず、代わりに undefined を返します。ただし、基になる 504 は Cloudflare Logs では確認できます。
Cloudflare Logs を使っている場合、RequestSource が edgeWorkerCacheAPI の 504 レスポンスが見えることがあります。キャッシュ済みアセットがない、または期限切れの場合、これは想定どおりです。なお、edgeWorkerCacheAPI リクエストは、Cache Analytics などほかのビューではすでに除外されています。これらのリクエストを除外する、またはサイトのエンドユーザーからのリクエストだけに絞り込むには、エンドユーザーで絞り込む を参照してください。
cache.delete(request, options);delete(request, options): Promise<boolean>
キャッシュから Response オブジェクトを削除し、Boolean レスポンスの Promise を返します。
true: レスポンスはキャッシュされていたが、削除されたfalse: 削除時点でレスポンスはキャッシュになかった
-
requeststring | Request- 検索キーとして使う文字列、または
Requestオブジェクトです。文字列は、新しいRequestオブジェクトの URL として解釈されます。
- 検索キーとして使う文字列、または
-
optionsobject- 取りうるプロパティは
ignoreMethod(Boolean)だけです。実際の値にかかわらず、リクエストメソッドを GET として扱います。
- 取りうるプロパティは