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 を必ずデプロイ後に確認する習慣を持つこと。