Cloudflareキャッシュをバイパスしてオリジンに直撃させる5つの方法

インフラ中級
CloudflareCacheHTTP-HeadersDevOps

TL;DR

Cloudflare のキャッシュを「通す/通さない」を正確にコントロールしたい場面は開発・本番問わず頻繁にある。このページでは 5つのバイパス手段 を実務視点でまとめた。コピペ可能な設定スニペット付き。


1. Cache-Control: no-store をオリジンから返す

最もシンプルな方法。オリジン(サーバー)が Cache-Control: no-store を返せば、Cloudflare はそのレスポンスをキャッシュしない。

HTTP/1.1 200 OK
Cache-Control: no-store
Content-Type: application/json

nginx 設定例:

location /api/ {
    proxy_pass http://backend;
    add_header Cache-Control "no-store, no-cache, must-revalidate";
}

注意点: no-cache はキャッシュを「保存するが毎回検証する」という意味。no-store は「保存しない」。両者を混同しないこと。


2. Cache Rules(旧 Page Rules)で特定パスをバイパス

Cloudflare Dashboard → Cache Rules で URL パターンに対してキャッシュを無効化できる。

If URL path matches: /admin/*
Then: Cache Status = Bypass

Terraform で管理する場合:

resource "cloudflare_ruleset" "cache_bypass" {
  zone_id = var.zone_id
  name    = "Cache Bypass Rules"
  kind    = "zone"
  phase   = "http_request_cache_settings"

  rules {
    action = "set_cache_settings"
    action_parameters {
      cache = false
    }
    expression  = "(http.request.uri.path wildcard \"/admin/*\")"
    description = "Bypass cache for admin paths"
    enabled     = true
  }
}

3. CF-Cache-Status ヘッダーでキャッシュ状態を確認する

バイパスが効いているか確認するには CF-Cache-Status レスポンスヘッダーを見る。

意味
HIT キャッシュから返却
MISS キャッシュなし → オリジンから取得してキャッシュ
BYPASS キャッシュルールでバイパス
EXPIRED キャッシュ期限切れ → オリジンから再取得
DYNAMIC Cloudflare がキャッシュ不可と判断 (APIレスポンス等)
curl -sI https://example.com/api/data | grep -i cf-cache-status
# CF-Cache-Status: BYPASS

4. 開発時: cf-cache-status: BYPASS を強制するカスタムヘッダー

ローカル開発でも Cloudflare 経由でテストするケース向け。リクエストに Cache-Control: no-cache を付けるだけで Cloudflare はオリジンに問い合わせる。

curl -H "Cache-Control: no-cache" https://example.com/page

Postman / Insomnia でも同様にヘッダーを追加するだけ。


5. Workers で条件分岐バイパス

Edge ロジックで動的にキャッシュをバイパスしたい場合は Workers を使う。

export default {
  async fetch(request, env) {
    const url = new URL(request.url);

    // ユーザー認証クッキーがある場合はバイパス
    const hasSession = request.headers.get('Cookie')?.includes('session=');

    if (hasSession) {
      return fetch(request, { cf: { cacheEverything: false } });
    }

    return fetch(request, {
      cf: {
        cacheEverything: true,
        cacheTtl: 3600,
      },
    });
  },
};

まとめ

方法 用途 難易度
Cache-Control: no-store オリジン側で制御 ★☆☆
Cache Rules URL パターンで一括管理 ★☆☆
CF-Cache-Status 確認 デバッグ ★☆☆
リクエストヘッダー 開発時の即席テスト ★☆☆
Workers 動的・条件分岐 ★★☆

キャッシュ制御は「設定したつもり」と「実際に効いている」のギャップが事故の元。CF-Cache-Status を必ずデプロイ後に確認する習慣を持つこと。

記事一覧に戻る