Cloudflareのキャッシュ命中率が30%しかない?この3つのルール設定で90%まで爆上げする方法

先月、自分のブログのCloudflare分析画面を見ていて愕然としました。キャッシュ命中率(Cache Hit Ratio)が30%前後をうろうろしていたのです。
「え、CDN入れてるのに?」
詳しく調べると、画像やCSSはキャッシュされているものの、肝心のHTMLページは毎回オリジンサーバー(自宅サーバー)に取りに来ていました。これではCDNの意味が半減です。
実は、CloudflareはデフォルトではHTMLファイルをキャッシュしません。これは動的なコンテンツ(ログインユーザーごとの表示など)を誤ってキャッシュしないための安全策なのですが、ブログのような「誰が見ても同じ静的コンテンツ」にとっては機会損失でしかありません。
この記事では、Cloudflareの新しい設定機能であるCache Rules(従来のPage Rulesの後継)を使って、安全にHTMLをフルキャッシュし、サイト速度を爆速化する方法を解説します。
なぜCloudflareはHTMLをキャッシュしないのか?
デフォルトのキャッシュ挙動
Cloudflareが標準でキャッシュするのは、拡張子で判断される静的ファイルのみです。
- キャッシュする:
.jpg,.png,.css,.js,.woffなど - キャッシュしない:
.html,.php, ディレクトリ末尾(/aboutなど)
安全のための設計
もしHTMLを無条件にキャッシュしてしまうと、例えば「WordPressの管理画面にログインした状態のページ」がキャッシュされ、世界中の人が「あなたのアカウントでログイン済みの管理画面」を見れてしまう……なんていう大事故(セッションリーク)が起きかねません。
だからCloudflareは「HTMLは動的かもしれないから、とりあえずスルーしよう」という安全側の設計になっているのです。
しかし、ブログ記事や企業サイトのトップページは99%静的です。ここをキャッシュしない手はありません。
Page Rulesは廃止へ。これからはCache Rules
これまで、この設定には「Page Rules」の「Cache Level: Cache Everything」を使うのが定石でした。
しかし、Page Rulesは**非推奨(Deprecated)**になりつつあります。
- 無料プランでのルール数制限が厳しい(3つまで)。
- 設定の柔軟性が低い。
- Cloudflare自身が新しい「Cache Rules」への移行を推奨している。
Cache Rulesは設定項目が細分化され、無料プランでも10個までルール作成が可能(ゾーン全体設定とは別枠)など、大幅に使いやすくなっています。今から設定するならCache Rules一択です。
実践:キャッシュ命中率90%を実現する3つのルール
Cloudflareのダッシュボードで、Caching > Cache Rules を開き、「Create rule」から設定していきます。
ルールの実行順序(Priority)が重要です。上から順に評価されるため、「除外設定」を先に、「包括設定」を後に書くのが鉄則です。
ルール1:管理画面・ログインページの除外(最優先)
まずは事故を防ぐため、キャッシュしてはいけないページを明示的に除外します。
- Rule name:
Bypass Admin Pages - Priority: 1(一番上に配置)
- When incoming requests match:
- Field:
URI Path - Operator:
contains - Value:
/wp-admin(WordPressの場合) - OR Field:
URI Pathcontains/wp-login.php - OR Field:
Cookiecontainswordpress_logged_in(ログインユーザーを除外する上級設定)
- Field:
- Then:
- Cache eligibility:
Bypass cache(キャッシュしない)
- Cache eligibility:
これで、管理画面は常にオリジンサーバーにアクセスするようになり、安全が確保されます。
ルール2:静的リソースのキャッシュ強化(推奨)
画像などの静的ファイルに対するキャッシュ期間を明示的に延ばします。
- Rule name:
Static Assets Cache - Priority: 2
- When incoming requests match:
- Field:
File extension - Operator:
is in - Value:
jpg png gif css js woff woff2 svg…
- Field:
- Then:
- Cache eligibility:
Eligible for cache - Edge TTL:
Ignore cache-control header and use this TTL->1 month - Browser TTL:
Override origin->1 day
- Cache eligibility:
これにより、オリジンサーバーの設定に関わらず、Cloudflareエッジ上で1ヶ月間ファイルを保持させます。
ルール3:HTMLを含む「その他すべて」の強制キャッシュ
これが本丸です。ここまでのルールに当てはまらなかったリクエスト(=通常の記事ページなどのHTML)を強制的にキャッシュします。
- Rule name:
Cache HTML / Everything - Priority: 3(一番下)
- When incoming requests match:
- Field:
Hostnameequalsyour-blog.com(または All incoming requests)
- Field:
- Then:
- Cache eligibility:
Eligible for cache - Edge TTL:
Ignore cache-control header and use this TTL->7 days(更新頻度に合わせて調整) - Browser TTL:
Respsect origin(ブラウザ側でのキャッシュは控えめにするのがおすすめ)
- Cache eligibility:
注意: 無料プランではEdge TTLの最小単位は2時間(または設定によってはもっと長い)です。記事を更新した直後に反映されないことがあるため、後述の「キャッシュパージ」が必要になります。
設定後の確認と運用
キャッシュの確認方法
設定後、ブラウザのデベロッパーツール(Networkタブ)でレスポンスヘッダを確認します。
HTMLページへのリクエストに対し、レスポンスヘッダに以下があれば成功です。
cf-cache-status: HIT(キャッシュから配信された)cf-cache-status: MISS(キャッシュになかったので取りに行った。次回HITになるはず)
もし DYNAMIC や BYPASS のままであれば、ルール設定を見直してください。ルール1の除外条件に引っかかっているか、ルール3が適用されていません。
記事更新時のキャッシュ削除(Purge)
HTMLをキャッシュすると、記事をリライトしても読者には古い記事が表示され続けます。
更新のたびに以下を行う必要があります。
- Cloudflareダッシュボード > Caching > Configuration。
- Purge Cache > Custom Purge。
- 更新した記事のURLを入力してPurge。
WordPressユーザーの場合:
「Cloudflare」公式プラグインを導入しましょう。記事を更新すると自動的にそのページのキャッシュだけをAPI経由でPurgeしてくれます。これがあれば、TTLを「1ヶ月」にしても問題ありません。
Edge TTLの3つのモード
設定時に出てくるEdge TTLの設定には3つのモードがあります。初心者が一番迷うところです。
- Use cache-control header if present, bypass cache if not:
- 「オリジンサーバーが『キャッシュしていいよ』と言ったらキャッシュする。何も言ってこなかったらキャッシュしない」。
- 安全ですが、オリジンの設定依存になります。
- Use cache-control header if present, use default Cloudflare caching behavior if not(推奨):
- 「オリジンに従う。何も言ってこない場合はCloudflareのデフォルト(静的ファイルのみ)で動く」。
- Ignore cache-control header and use this TTL:
- 「オリジンの指示は無視して、強制的に指定時間キャッシュする」。
- HTMLをキャッシュしたい場合はこれを選びます。多くのWebサーバーはHTMLに対して
Cache-Control: no-cacheを返す設定になっているため、1や2ではキャッシュされません。
まとめ
CloudflareのCache Rulesを使いこなせば、月額数百ドルの高性能サーバーを借りるのと同じくらいのパフォーマンスを、無料で手に入れることができます。
特に個人のWordPressブログなどは、この設定を入れるだけで「世界中どこからでも爆速」になります。
設定の重要ポイントおさらい:
- Cache Rulesを使う(Page Rulesは卒業)。
- 除外ルール(Bypass)を最優先にする。管理画面のキャッシュは絶対NG。
- HTMLは「Ignore cache-control」で強制キャッシュする。
- 記事更新時の**Purge(削除)**運用を忘れない。
あなたのサイトも、キャッシュ命中率90%超えの「グリーンゾーン」を目指しましょう!
Cloudflare Cache Rules 全サイトキャッシュ設定フロー
HTMLを含めた全コンテンツをキャッシュし、サイトを高速化する設定手順
⏱️ Estimated time: 10 min
- 1
Step1: 管理画面の除外ルール作成
Cache Rulesで「Create rule」。URI Pathに「/wp-admin」「/login」などを含む場合、「Bypass cache」を選択。Priorityを1に設定。 - 2
Step2: HTML強制キャッシュルール作成
新しいルールを作成。All incoming requests(または特定のホスト)に対し、「Eligible for cache」を選択。Edge TTL設定で「Ignore cache-control header...」を選び、期間を「7 days」などに設定。Priorityを最後(一番数値大)に。 - 3
Step3: 設定の保存とデプロイ
Deployをクリック。反映まで数分待つ。 - 4
Step4: 動作確認
シークレットウィンドウで自サイトにアクセス。デベロッパーツールのNetworkタブでHTMLのレスポンスヘッダに「cf-cache-status: HIT」が出るまでリロード(最初はMISS)。
FAQ
個人情報が漏れたりしませんか?
Page Rulesと何が違うのですか?
設定したのにMISSのままです。
1. ルールの優先順位が間違っている(Bypassが下にあるなど)。
2. ブラウザのキャッシュが効いていてリクエストが飛んでいない。
3. テスト時に管理画面にログインしたままアクセスしており、Cookie除外ルール(もし設定していれば)に引っかかっている。
シークレットモードで確認するのが確実です。
4 min read · 公開日: 2025年12月1日 · 更新日: 2026年1月22日
関連記事
Next.js ファイルアップロード完全ガイド:S3/Qiniu Cloud 署名付き URL 直接アップロード実践

Next.js ファイルアップロード完全ガイド:S3/Qiniu Cloud 署名付き URL 直接アップロード実践
Next.js Eコマース実践:カートと Stripe 決済の完全実装ガイド

Next.js Eコマース実践:カートと Stripe 決済の完全実装ガイド
Next.js ユニットテスト実践:Jest + React Testing Library 完全設定ガイド


コメント
GitHubアカウントでログインしてコメントできます