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クローラがブロックされることがあります。 自動テストを組み込み、問題を早期に検知する体制を整えてください。