コンテンツにスキップ

キャッシュ

背景

Cache APIは、Cloudflareグローバルネットワークキャッシュからの読み取りおよび書き込みを細かく制御することを可能にします。

Cache APIはグローバルに利用可能ですが、キャッシュの内容は発信元データセンターの外では複製されません。GET /usersのレスポンスは発信元データセンターにキャッシュされますが、明示的に作成されない限り、他のデータセンターには存在しません。

カスタムドメインにデプロイされたWorkersは、機能的なcache操作にアクセスできます。Pages functionsも、カスタムドメインまたは*.pages.devドメインに接続されている場合、同様です。

ただし、Cloudflare Workersダッシュボードエディター、Playgroundプレビュー、および*.workers.devデプロイメントでのCache API操作は影響を与えません。Cloudflare AccessによってフロントエンドされているWorkersでは、Cache APIは現在利用できません。


キャッシュへのアクセス

caches.default APIは、ウェブブラウザの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を参照してください。
  • Cache-Tag
    • 後でタグによるリソースのパージを可能にします(エンタープライズのみ)。
  • ETag
    • cache.match()If-None-Matchを使用して条件付きリクエストを評価できるようにします。
  • Expires文字列
    • リソースが無効になる時期を指定する文字列です。
  • Last-Modified
    • cache.match()If-Modified-Sinceを使用して条件付きリクエストを評価できるようにします。

これは、ウェブブラウザのCache APIとは異なり、リクエストまたはレスポンスのヘッダーを尊重しません。


メソッド

Put

cache.put(request, response);
  • put(request, response) : Promise

    • 指定されたリクエストをキーとして使用して、レスポンスをキャッシュに追加しようとします。キャッシュがレスポンスを正常に保存したかどうかに関わらず、undefinedに解決されるPromiseを返します。

パラメータ

  • request string | Request

    • キーとして使用される文字列またはRequestオブジェクトです。文字列が渡されると、新しいRequestオブジェクトのURLとして解釈されます。
  • response Response

    • 指定されたキーの下に保存されるResponseオブジェクトです。

無効なパラメータ

cache.putは以下の場合にエラーをスローします:

  • 渡されたrequestGET以外のメソッドです。
  • 渡されたresponsestatus206 Partial Contentです。
  • 渡されたresponseVary: *ヘッダーを含んでいます。Varyヘッダーの値はアスタリスク(*)です。詳細についてはCache API仕様を参照してください。

エラー

cache.putは、Cache-Controlがキャッシュしないよう指示するか、レスポンスが大きすぎる場合に413エラーを返します。

Match

cache.match(request, options);
  • match(request, options) : Promise<Response | undefined>

    • そのリクエストにキー付けされたレスポンスオブジェクトをラップするPromiseを返します。

パラメータ

  • request string | 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レスポンスになります。あなたのCloudflareキャッシュは、レスポンスにAccept-Rangesヘッダーがあっても、常に範囲リクエストを尊重します。
  • If-Modified-Since

    • 一致するレスポンスがLast-Modifiedヘッダーを持ち、その値がIf-Modified-Sinceで指定された時間以降である場合、304レスポンスになります。
  • If-None-Match

    • 一致するレスポンスがETagヘッダーを持ち、その値がIf-None-Matchの値と一致する場合、304レスポンスになります。
  • cache.match()

    • オリジンにサブリクエストを送信することはありません。一致するレスポンスがキャッシュに見つからない場合、cache.match()が返すPromiseはundefinedで満たされます。

エラー

cache.matchは、要求されたコンテンツが見つからないか期限切れの場合に504エラー応答を生成します。Cache APIはこの504をWorkerスクリプトに直接公開せず、代わりにundefinedを返します。それでも、基礎となる504はCloudflare Logsで見ることができます。

Cloudflare Logsを使用している場合、RequestSourceedgeWorkerCacheAPIのこれらの504レスポンスを見ることができます。これらはキャッシュされたアセットが見つからなかったり期限切れだった場合に予想されるものです。edgeWorkerCacheAPIリクエストは、Cache Analyticsなどの他のビューではすでにフィルタリングされています。これらのリクエストをフィルタリングするか、あなたのウェブサイトのエンドユーザーによるリクエストのみをフィルタリングするには、エンドユーザーのフィルタリングを参照してください。

Delete

cache.delete(request, options);
  • delete(request, options) : Promise<boolean>

キャッシュからResponseオブジェクトを削除し、BooleanレスポンスのPromiseを返します:

  • true: レスポンスはキャッシュされていましたが、現在は削除されました。
  • false: レスポンスは削除時にキャッシュに存在しませんでした。

パラメータ

  • request string | Request

    • ルックアップキーとして使用される文字列またはRequestオブジェクトです。文字列は新しいRequestオブジェクトのURLとして解釈されます。
  • options object

    • 一つの可能なプロパティを含むことができます:ignoreMethod(Boolean)。リクエストメソッドを実際の値に関わらずGETと見なします。

関連リソース