2026年5月20日
2026年5月20日
WordPressのCloudflare詳細設定|WAFカスタムルール・レート制限・Cache Rules・Workers
Cloudflare は CDN(コンテンツの配信)だけでなく、WAF(不正なアクセスを止める仕組み)、レート制限、エッジで動くプログラム(Workers)などの機能を持っています。この記事では、Cloudflare を通して配信している WordPress サイトで、ログイン画面の保護、キャッシュの調整、セキュリティヘッダーの追加を行う設定を説明します。プランごとの上限や画面名は、2026年11月時点で Cloudflare の公式ドキュメント(developers.cloudflare.com)で確認したものです。Cloudflare の画面は変更が多いので、名前が違う場合は公式ドキュメントで確認してください。
Cloudflare をまだ設定していない場合や、Cloudflare 経由で訪問者の本当の IP アドレスをサーバーに渡す設定は、「WordPress に Cloudflare を設定する手順」を先に参照してください。
プランごとの主な上限(2026年11月時点)
| 機能 | Free | Pro | Business |
|---|---|---|---|
| WAF のカスタムルール | 5個 | 20個 | 100個 |
| カスタムルールでの正規表現 | 使えない | 使えない | 使える |
| レート制限ルール | 1個(数える単位は IP、期間10秒、遮断10秒、条件はパスなど) | プランにより拡大 | プランにより拡大 |
| マネージドルール | Cloudflare Free Managed Ruleset | Cloudflare Managed Ruleset・OWASP Core Ruleset も使える | 同左 |
| Cache Rules | 10個 | 25個 | 50個 |
| Page Rules(非推奨) | 3個 | 20個 | 50個 |
| Workers | 1日10万リクエスト・1回あたり CPU 10ミリ秒まで無料 | 有料の Workers プランは月5米ドルから | 同左 |
WAF のカスタムルールでログイン画面などを守る
カスタムルールは、条件に合うリクエストを、サーバーに届く前にブロックしたりチャレンジ(ボットかどうかの確認)を出したりする設定です。
- Cloudflare のダッシュボードでドメインを選び、「Security rules」(セキュリティルール)のページを開きます。
- 「Create rule」から「Custom rules」を選びます。
- 「Rule name」に名前を入れ、「When incoming requests match」で条件を作ります。条件は画面で選ぶほか、「Edit expression」で式を直接書けます。
- 「Then take action」で動作を選び、「Deploy」で有効にします。
WordPress でよく使う例を3つ挙げます。Free プランでは5個まで作れるので、必要なものから入れます。
例1: wp-login.php を海外から開くときにチャレンジを出す
日本からだけログインするサイトの例です。日本以外からのアクセスには、「Managed Challenge」でボットかどうかを確かめます。
(http.request.uri.path eq "/wp-login.php" and ip.src.country ne "JP")
- 動作: Managed Challenge
- 海外出張先や、海外のサーバーから管理する人がいる場合は、その人も確認画面を通ることになります。日本以外からのログインを止めてしまう場合は「Block」を選びますが、自分が締め出されないよう、先に「Managed Challenge」で様子を見ます。
- 国の判定には
ip.src.countryを使います(以前のip.geoip.countryは非推奨です)。
例2: xmlrpc.php へのアクセスを止める
(http.request.uri.path eq "/xmlrpc.php")
- 動作: Block
- XML-RPC は、パスワードの総当たりや大量のピンバックに使われることがあります。ただし、Jetpack や一部のスマートフォンアプリ、外部からの投稿ツールは XML-RPC を使うので、使っていないことを確かめてから止めます。WordPress 側で止める方法は「WordPressのXMLRPCを無効化する方法」で説明しています。
例3: アップロード用のフォルダーにある PHP の実行を止める
画像などを置く wp-content/uploads に PHP ファイルが置かれて実行される被害を防ぎます。通常の WordPress では、このフォルダーの PHP を直接開く必要はありません。
(http.request.uri.path contains "/wp-content/uploads/" and http.request.uri.path contains ".php")
- 動作: Block
ルールを入れた後は、セキュリティの分析画面(Security の Analytics や Events)で、どのルールが何件のリクエストに働いたかを確認し、正しいアクセスを止めていないかを見ます。
レート制限でログインの試行回数を抑える
レート制限ルールは、同じ IP アドレスからの短時間の大量アクセスを止める設定です。カスタムルールと同じ「Security rules」の「Create rule」から「Rate limiting rules」を選んで作ります。
Free プランでは1個だけ作れ、条件に使えるのはパスなど一部の項目、数える期間と遮断する時間はどちらも10秒です。リクエストのメソッド(POST だけを数える、など)を条件にするのは上位のプランの機能です。Free プランでの設定例は次のとおりです。
| 項目 | 設定 |
|---|---|
| 条件 | URI Path が /wp-login.php と等しい |
| 数える単位 | IP |
| しきい値 | 10秒間に5リクエスト(GET も数えるので、通常のログインで超えない数にする) |
| 動作 | Block(10秒間) |
レート制限とカスタムルールを組み合わせた設定は、「WordPressのログイン試行をCloudflareで制限する方法」でも説明しています。
マネージドルールを確認する
Free プランでは「Cloudflare Free Managed Ruleset」が使えます。広く悪用されている脆弱性への攻撃を止めるルールのセットで、Cloudflare 側で更新されます。Pro 以上のプランでは、より多くのルールを含む「Cloudflare Managed Ruleset」と「Cloudflare OWASP Core Ruleset」も使えます。マネージドルールで正しいアクセス(管理画面での保存など)が止められた場合は、セキュリティの分析画面で該当のルールを特定し、そのルールだけを例外にします。
WAF の設定全体の考え方は「WordPressをCloudflare WAFで守る設定」でまとめています。
キャッシュの設定は Page Rules ではなく Cache Rules で行う
Page Rules は、2026年11月時点の公式ドキュメントで非推奨(deprecated)とされています。Cloudflare は既存の Page Rules を新しい機能へ自動で移す予定を案内しており、キャッシュの設定は Cache Rules、セキュリティレベルは Configuration Rules、転送は Redirect Rules(Single Redirects)が受け持ちます。新しく設定する場合は Cache Rules を使います。
Cloudflare が標準でキャッシュするもの
Cloudflare は、標準では画像・CSS・JavaScript などの静的なファイルを拡張子で判断してキャッシュし、HTML はキャッシュしません。そのため、何も設定しなければ、WordPress の管理画面やログイン後のページが他人にキャッシュとして配信されることはありません。
例: アップロードした画像を長くキャッシュする
「Rules」の Cache Rules で、新しいルールを作ります。
(http.request.uri.path contains "/wp-content/uploads/")
- Cache eligibility: Eligible for cache
- Edge TTL: 元のサーバーの指定を上書きして、1か月など長めにする
- Browser TTL: 1週間など
画像を同じファイル名で差し替えると、古い画像がしばらく表示されます。差し替えたときは、Cloudflare の「Caching」の「Configuration」から、そのURLのキャッシュを削除(Purge)します。
HTML もキャッシュしたい場合
Cache Rules で「Eligible for cache」を選ぶと、そのルールに合うものは HTML も含めてキャッシュの対象になります。WordPress の HTML をキャッシュする場合は、管理画面(/wp-admin/)・wp-login.php・ログインしている人・コメントを書いた人・プレビュー、WooCommerce ならカートや購入手続きのページを、キャッシュの対象から外す必要があります。条件を誤ると、ログインした人のページが他の訪問者に表示されるおそれがあるので、自分でルールを組むより、Cloudflare の公式プラグイン「Cloudflare」と組み合わせて使う APO(Automatic Platform Optimization)や、Cloudflare に対応したキャッシュ系プラグインの利用を検討してください。APO を使うには、公式ドキュメントのとおり Cloudflare の WordPress プラグインが必要です。
セキュリティヘッダーを付ける
Transform Rules で付ける(コード不要)
Cloudflare の「Rules」にある Transform Rules の「Response Header Transform Rules」(レスポンスヘッダーの変更)で、サイトのレスポンスにヘッダーを付けられます。操作は「Set static」を選び、ヘッダー名と値を入れます。
| ヘッダー | 値の例 | 意味 |
|---|---|---|
X-Content-Type-Options |
nosniff |
ファイルの種類の推測を止める |
Referrer-Policy |
strict-origin-when-cross-origin |
外部サイトに送る参照元の情報を減らす |
X-Frame-Options |
SAMEORIGIN |
他のサイトの iframe に埋め込まれるのを防ぐ |
Content-Security-Policy は、WordPress のテーマやプラグイン、広告やアクセス解析のタグを止めてしまうことがあるので、いきなり付けず、Content-Security-Policy-Report-Only で影響を確かめてから設定します。サーバー側(.htaccess や Nginx)で付ける方法は「WordPressのセキュリティヘッダー設定方法」で説明しています。
Workers で付ける(条件で分けたい場合)
HTML のときだけ付ける、パスごとに値を変えるなど、条件で分けたい場合は Workers を使えます。現在の Workers は、次の ES モジュール形式で書きます(addEventListener('fetch', …) を使う古い書き方の例が多く出回っていますが、新しく作るならこちらにします)。
export default {
async fetch(request, env, ctx) {
// 元のサーバー(Cloudflare のキャッシュを含む)からレスポンスを受け取る
const response = await fetch(request);
// HTML 以外はそのまま返す
const contentType = response.headers.get('content-type') || '';
if (!contentType.includes('text/html')) {
return response;
}
// ヘッダーを変更できるように、レスポンスを作り直す
const newResponse = new Response(response.body, response);
newResponse.headers.set('X-Content-Type-Options', 'nosniff');
newResponse.headers.set('Referrer-Policy', 'strict-origin-when-cross-origin');
newResponse.headers.set('X-Frame-Options', 'SAMEORIGIN');
return newResponse;
},
};
作った Worker は、ドメインのルート(例: example.com/*)に割り当てると、そのURLへのリクエストで動きます。Workers は、ルートに合うリクエストのたびに実行され、画像や CSS へのリクエストも数えられます。Free プランの1日10万リクエストの上限に収まるかを、サイトのアクセス数と照らして確認してください。単にヘッダーを付けるだけなら、Workers のリクエスト数を使わない Transform Rules のほうが向いています。
キャッシュが効いているかを確かめる
Cloudflare を通したレスポンスには cf-cache-status というヘッダーが付きます。curl で確かめられます。
# 画像のキャッシュ状況(2回目以降に HIT になるかを見る)
curl -sI https://example.com/wp-content/uploads/2026/11/sample.jpg | grep -i cf-cache-status
# HTML(標準の設定では DYNAMIC になる)
curl -sI https://example.com/ | grep -i cf-cache-status
| 値 | 意味 |
|---|---|
HIT |
Cloudflare のキャッシュから返した |
MISS |
キャッシュに無く、元のサーバーから取ってきた |
EXPIRED |
キャッシュの期限が切れていたので、元のサーバーから取り直した |
BYPASS |
設定によりキャッシュを使わなかった |
DYNAMIC |
キャッシュの対象ではない(標準の HTML など) |
このヘッダーは訪問者へのレスポンスに付くもので、WordPress(元のサーバー)へのリクエストには付きません。PHP の中でキャッシュの状況を調べることはできないので、ブラウザーの開発者ツールか curl で確認します。
設定を変えるときの注意
- ルールを追加・変更したら、ログイン、投稿の保存、問い合わせフォームの送信、(あれば)購入手続きを一通り試し、止められていないかを確認します。
- 問題が起きたときにすぐ戻せるよう、ルールの名前に目的を書き、変更した日を記録しておきます。
- 元のサーバーの IP アドレスが知られていると、Cloudflare を通らずに直接アクセスされ、WAF やレート制限が効きません。サーバー側のファイアウォールで、Web のポートへの接続を Cloudflare の IP アドレスからに限ると、この抜け道を防げます。