AIクローラがサイトにアクセスできなければ、AI検索に自社コンテンツが引用されることはありません。 robots.txtやメタタグを正しく設定しても、CDNやWAFの段階でブロックされていれば意味がなくなります。

CDNのBot対策機能がAIクローラのアクセスを拒否しているケースは少なくありません。 この記事では、CDNとAIクローラの相性問題と、その対処法を解説します。

CDNがAIクローラをブロックする仕組み

多くのCDNには「Bot Management」や「Bot Fight Mode」と呼ばれる機能があります。 自動化されたアクセスを検知し、User-Agent判定、JavaScript Challenge、CAPTCHA、IPレピュテーション、リクエスト頻度などの基準でブロックします。

AIクローラはボットの一種です。 User-AgentにBot名を含み、JavaScriptを実行せず、短時間に多くのページにアクセスするため、Bot対策機能から見ると「ブロックすべきボット」の特徴をすべて備えています。

ブロックされたときの症状

症状原因
AI検索で自社サイトが一切表示されないAIクローラがアクセスできていない
AI検索で古い情報のみ表示されるCDN設定変更後にブロックが始まった
サーバーログにAIクローラのアクセスがないCDNエッジで拒否されオリジンに未到達

確認方法は、サーバーログでAIクローラのUser-Agentを検索することです。

grep -E "GPTBot|ClaudeBot|PerplexityBot" /var/log/nginx/access.log | \
  awk '{print $9}' | sort | uniq -c | sort -rn

403や503が大量に返っていれば、CDNの設定を見直す必要があります。

Cloudflareでの対処法

Bot Fight Mode

無料プランの「Bot Fight Mode」が有効な場合、AIクローラもブロック対象になることがあります。 Security → Bots → Bot Fight Modeで確認できます。

WAFカスタムルールでの細かい制御

WAFのカスタムルールで、特定のAIクローラのみ許可する設定が最も実用的です。 Security → WAF → Custom rulesで以下のルールを作成します。

ルール名: Allow AI Crawlers

式:

(http.user_agent contains "GPTBot") or
(http.user_agent contains "ChatGPT-User") or
(http.user_agent contains "ClaudeBot") or
(http.user_agent contains "PerplexityBot") or
(http.user_agent contains "Google-Extended")

アクション: Skip(WAFルールをスキップ)

このルールを他のBot対策ルールよりも上位に配置します。 OpenAIはGPTBotのIPレンジを公開しているため、IPベースの検証を追加すると安全性が上がります。

(http.user_agent contains "GPTBot" and ip.src in {40.88.21.235/32 20.15.240.64/28})

Cloudflare AI Audit

Security → Bots → AI AuditでAIクローラごとのアクセス状況を可視化し、個別に許可・拒否を設定できます。

キャッシュの注意点

キャッシュの有効期限内にコンテンツを更新した場合、AIクローラは古いキャッシュを取得する可能性があります。 コンテンツ更新時にキャッシュをパージする仕組みを組み込んでおきます。

curl -X POST "https://api.cloudflare.com/client/v4/zones/{zone_id}/purge_cache" \
  -H "Authorization: Bearer {api_token}" \
  -H "Content-Type: application/json" \
  -d '{"files":["https://example.com/blog/updated-article"]}'

Vercelでの対処法

VercelのFirewallでAIクローラを許可するルールを設定します。

{
  "firewall": {
    "rules": [
      {
        "name": "Allow AI Crawlers",
        "conditions": [
          {
            "type": "user-agent",
            "op": "re",
            "value": "(GPTBot|ClaudeBot|PerplexityBot|ChatGPT-User|Google-Extended)"
          }
        ],
        "action": "allow"
      }
    ]
  }
}

Edge MiddlewareでAIクローラに特別なヘッダーを返すことも可能です。

// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

const AI_CRAWLERS = ['GPTBot', 'ChatGPT-User', 'ClaudeBot', 'PerplexityBot', 'Google-Extended']

export function middleware(request: NextRequest) {
  const userAgent = request.headers.get('user-agent') || ''
  const isAICrawler = AI_CRAWLERS.some(c => userAgent.includes(c))

  if (isAICrawler) {
    const response = NextResponse.next()
    response.headers.set('Cache-Control', 'public, max-age=3600, s-maxage=3600')
    response.headers.set('X-Robots-Tag', 'index, follow')
    return response
  }
  return NextResponse.next()
}

JavaScript Challengeの問題

JavaScript Challengeは、AIクローラにとって特に厄介です。 アクセス時にJavaScriptの実行結果を要求しますが、AIクローラはJavaScriptを実行できません。

対処法は、AIクローラのUser-Agentに対してChallenge をスキップする設定です。 前述のWAFカスタムルールで対応できます。

CDN設定のデバッグ方法

curlコマンドで各AIクローラのUser-Agentを指定してテストします。

# GPTBotとしてアクセス
curl -sI -A "GPTBot/1.0" https://example.com/blog/test-article

# ClaudeBotとしてアクセス
curl -sI -A "ClaudeBot/1.0" https://example.com/blog/test-article

# 通常のブラウザとしてアクセス(比較用)
curl -sI -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" https://example.com/blog/test-article

ブラウザでは200が返るのに、AIクローラのUser-Agentでは403や503が返る場合、CDNの設定が原因です。 cf-mitigated: challengeがレスポンスに含まれていれば、CAPTCHAが発行されています。

監視の自動化

#!/bin/bash
URLS=("https://example.com/" "https://example.com/blog/latest-article")
CRAWLERS=("GPTBot/1.0" "ClaudeBot/1.0" "PerplexityBot")

for url in "${URLS[@]}"; do
  for crawler in "${CRAWLERS[@]}"; do
    status=$(curl -sI -A "$crawler" -o /dev/null -w "%{http_code}" "$url")
    if [ "$status" != "200" ]; then
      echo "ALERT: $crawler -> $url returned $status"
    fi
  done
done

このスクリプトをcronやGitHub Actionsで定期実行すると、CDN設定変更によるブロックを早期に検知できます。

キャッシュ戦略のベストプラクティス

ブログ記事: Cache-Control: public, max-age=3600, s-maxage=86400, stale-while-revalidate=604800
トップページ: Cache-Control: public, max-age=600, s-maxage=3600
静的アセット: Cache-Control: public, max-age=31536000

stale-while-revalidateを設定すると、キャッシュ期限切れ後も古いキャッシュを返しつつバックグラウンドで更新します。 AIクローラがタイムアウトするリスクを減らせます。

チェックリスト

チェック項目確認方法
AIクローラのUser-Agentで200が返るかcurlで各User-Agentをテスト
Bot Fight Modeの設定は適切かCDNダッシュボードで確認
WAFルールがAIクローラを許可しているかWAFルールの優先順位を確認
JavaScript Challengeが発生していないかレスポンスヘッダーで確認
コンテンツ更新時にキャッシュがパージされるか更新後にcurlで確認

まとめ

CDNのBot対策機能は、AIクローラのアクセスを意図せずブロックすることがあります。 対処の基本方針は「AIクローラのUser-Agentを識別し、WAFルールで許可する」ことです。

定期的な監視も重要です。 CDNの設定変更やアップデートによって、知らない間にAIクローラがブロックされることがあります。 自動テストを組み込み、問題を早期に検知する体制を整えてください。