2026年5月20日

2026年5月20日

WordPressのCDNを設定する方法(Cloudflare対応)

はじめに

CloudflareはCDN・DDoS防御・SSL・WAFを無料で提供するサービスです。DNSをCloudflareに向けるだけでコンテンツを世界中のエッジサーバーから配信でき、日本国内のユーザーにも最寄りのサーバーからコンテンツが届くようになります。

症状・原因

  • 海外からのアクセスが遅い
  • DDoS攻撃を受けてサイトがダウンした
  • 画像などの静的ファイルのダウンロードが遅い
  • SSL証明書の管理が面倒

解決手順

ステップ1:Cloudflareにサインアップしてドメインを追加する

1. https://www.cloudflare.com/ でアカウント作成
2. 「サイトを追加」でドメインを入力
3. プラン選択(Free プランで基本機能は十分)
4. 既存のDNSレコードが自動スキャンされる
5. Cloudflareが提供するネームサーバーを確認
# ドメインレジストラでネームサーバーを変更
# Cloudflareから提供されるNSレコードに変更例:
# NS: aicha.ns.cloudflare.com
# NS: brendon.ns.cloudflare.com

# 変更後の確認(反映に数時間かかる場合あり)
dig NS example.com +short
# → cloudflareのネームサーバーが返ればOK

ステップ2:SSL/TLSモードを設定する

Cloudflareダッシュボード → SSL/TLS → 概要

推奨設定:
- 「フル(厳格)」: サーバーに有効なSSL証明書がある場合(最も安全)
- 「フル」: 自己署名証明書の場合
- 「柔軟」: サーバーにSSLがない場合(WordPressの管理画面が壊れる可能性あり)

※ Wordressサイトでは「フル(厳格)」を推奨
   「柔軟」にするとログインループが発生することがある
// wp-config.php: Cloudflare経由のSSLを正しく認識させる
// Cloudflareは80番ポートでサーバーと通信し、ユーザーにはHTTPSを提供する
// WordPressがHTTPと認識してしまう場合に設定

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
    $_SERVER['HTTPS'] = 'on';
}

define('WP_HOME',    'https://example.com');
define('WP_SITEURL', 'https://example.com');

ステップ3:Cloudflareのキャッシュルールを設定する

Cloudflareダッシュボード → キャッシュ → キャッシュルール

ルール1: WordPressの管理画面・ログインをキャッシュしない
  一致条件: URI パス → 次と一致する: /wp-admin/*
            OR Cookie → 名前が次と一致する: wordpress_logged_in_*
  設定: キャッシュ対象外

ルール2: 静的ファイルをキャッシュ
  一致条件: ファイル拡張子 → 次と一致する: jpg, jpeg, png, gif, webp, css, js
  設定: キャッシュあり + エッジTTL: 30日

ステップ4:WordPress側でCloudflareと連携する

// functions.php

// Cloudflareが付与するCFヘッダーを使ってIPを取得
function mytheme_get_real_ip(): string {
    // Cloudflare経由のリクエストは CF-Connecting-IP ヘッダーにIPが入る
    if (!empty($_SERVER['HTTP_CF_CONNECTING_IP'])) {
        return sanitize_text_field($_SERVER['HTTP_CF_CONNECTING_IP']);
    }

    return sanitize_text_field($_SERVER['REMOTE_ADDR'] ?? '');
}

// Cloudflare Workers KVでキャッシュパージのWebhookを受け取る
function mytheme_cloudflare_purge_on_save(int $post_id): void {
    if (wp_is_post_revision($post_id)) {
        return;
    }

    $cf_zone_id = defined('CF_ZONE_ID') ? CF_ZONE_ID : '';
    $cf_api_key = defined('CF_API_KEY') ? CF_API_KEY : '';

    if (!$cf_zone_id || !$cf_api_key) {
        return;
    }

    $url = get_permalink($post_id);

    // Cloudflare API でURLのキャッシュをパージ
    wp_remote_post(
        "https://api.cloudflare.com/client/v4/zones/{$cf_zone_id}/purge_cache",
        [
            'headers' => [
                'Authorization' => 'Bearer ' . $cf_api_key,
                'Content-Type'  => 'application/json',
            ],
            'body'    => wp_json_encode(['files' => [$url, home_url('/')]]),
            'timeout' => 10,
        ]
    );
}
add_action('save_post', 'mytheme_cloudflare_purge_on_save');
// wp-config.php: Cloudflare APIキーを安全に管理
define('CF_ZONE_ID', 'your-zone-id-here');
define('CF_API_KEY', 'your-api-token-here');

ステップ5:Cloudflareの推奨設定を有効化する

ダッシュボードで確認・設定する項目:

速度 → 最適化:
  ✅ Auto Minify(HTML・CSS・JS)
  ✅ Brotli圧縮
  ✅ Rocket Loaderは慎重に(JS実行順序が変わる場合あり)

セキュリティ:
  ✅ セキュリティレベル: 中(デフォルト)
  ✅ Bot Fight Mode
  ✅ HTTPS Always Redirect

ネットワーク:
  ✅ HTTP/2
  ✅ HTTP/3(QUIC)
  ✅ 0-RTT Connection Resumption

注意事項

  • Cloudflareの「柔軟」SSLモードはWordPressのログインループを引き起こす既知の問題があります。必ず「フル」または「フル(厳格)」を使用してください
  • Rocket Loaderを有効にするとJavaScriptの読み込み順序が変わるため、プラグインが動作しなくなることがあります。有効化前に十分にテストしてください
  • Cloudflare Proプラン以上でポーリッシュ(画像の自動最適化)が利用可能です

まとめ

CloudflareはDNSを変更するだけで導入でき、SSL・CDN・DDoS防御が一括で利用できます。WordPressではSSLモードを「フル(厳格)」に設定し、HTTP_X_FORWARDED_PROTO ヘッダーを確認して正しくHTTPSと認識させます。投稿更新時は Cloudflare API でキャッシュをパージして最新コンテンツを確実に配信します。

お気軽にご相談ください

お見積りへ お問い合わせへ