はじめに
個人開発でバイクポータルサイト MotoHub を運営しています。
先日、Aboutページに運営者情報とog:image(SNSシェア時のサムネイル画像)を追加してデプロイしたのですが、OGP確認ツール(ラッコツールズ)や Facebook Sharing Debugger で画像が取得できないという問題に遭遇しました。
HTMLソースを見ると <meta property="og:image" content="..."> は正しく出力されている。画像ファイルもブラウザから直接開ける。それなのにOGPツールからは取得できない。
原因は Cloudflare の Bot Fight Mode が SNSクローラーもブロックしていた ことでした。
この記事では、原因特定の過程と、WAFカスタムルールを使った恒久対策を紹介します。同じ問題で困っている方の参考になれば幸いです。
環境
- CDN: Cloudflare(Free プラン)
- Bot Fight Mode: ON
- 対象: Laravel 12 + Blade テンプレートの Aboutページ
-
OGP設定: Bladeの
<x-slot:ogImage>で指定
症状
発生した問題
- ラッコツールズで
https://motohub.jp/pages/aboutを確認 → 「OGPイメージ指定がありません」 エラー - Facebook Sharing Debugger でも同様にOGP画像が取得できない
- しかし、ブラウザでページのソースを見ると og:image タグは正しく出力されている
- 画像ファイル自体も
https://motohub.jp/images/about-ogp.pngで直接開ける
ブラウザでは正常、OGPツールではNG
この時点で「人間のアクセスは通るが、ボットのアクセスは何かに遮断されている」という仮説が立ちました。
原因特定までの切り分け
ステップ1:HTMLソースを確認
まず、実際に配信されているHTMLに og:image タグが含まれているか確認しました。
curl -s https://motohub.jp/pages/about | grep "og:image"
ブラウザで開いた時のソースには確かに以下が出力されていました:
<meta property="og:image" content="https://motohub.jp/images/about-ogp.png" />
HTMLは正しい。 ということは、ラッコツールズやFacebookのクローラーが取得しているHTMLが、ブラウザで見ているものと違うという可能性が浮上しました。
ステップ2:キャッシュ疑惑の切り分け
以下を順番に試しました:
- Cloudflareのキャッシュパージ(Custom Purge で該当URLを指定)
- Laravel のキャッシュクリア(
php artisan view:clear等) - URLに
?v=20260420のようなクエリを付けて再取得
それでも改善しない。キャッシュではない。
ステップ3:Bot Fight Mode を疑う
Cloudflareダッシュボードの設定を見返していて、Bot Fight Mode がONになっていることに気づきました。
Bot Fight Modeは、悪質なボットアクセスをJavaScriptチャレンジなどでブロックする機能ですが、許可リストが緩く、SNSクローラーや検索エンジンBotも巻き込んでブロックしてしまう可能性があります。
ステップ4:一時OFFで検証
検証のため Bot Fight Mode を一時的にOFFにしました:
Cloudflareダッシュボード → Security → Bots → Bot Fight Mode → トグルOFF
5分ほど待ってからラッコツールズで再確認すると、OGP画像が正常に取得できました!
これで原因が Bot Fight Mode であることが確定です。
恒久対策:WAFカスタムルールで善良Botを許可
Bot Fight Mode を OFF にしたままだと、悪質なBotアクセスが増えるリスクがあります(MotoHubでは過去に Council Bluffs / Singapore からのBot大量流入の実績あり)。
そこで、善良なSNSクローラーと検索エンジンBotだけを明示的に許可しつつ、Bot Fight Modeは有効化する構成にしました。
WAFカスタムルールの作成
Cloudflareダッシュボード → Security → Security rules → Custom rules → Create rule
以下の設定を入力します:
ルール名
Allow social media and SEO crawlers
Expression(マッチ条件)
「Edit expression」をクリックして、以下を直接貼り付け:
(http.user_agent contains "facebookexternalhit") or
(http.user_agent contains "Facebot") or
(http.user_agent contains "Twitterbot") or
(http.user_agent contains "LinkedInBot") or
(http.user_agent contains "Slackbot") or
(http.user_agent contains "Discordbot") or
(http.user_agent contains "WhatsApp") or
(http.user_agent contains "TelegramBot") or
(http.user_agent contains "LINE") or
(http.user_agent contains "Pinterest") or
(http.user_agent contains "Applebot") or
(http.user_agent contains "Googlebot") or
(http.user_agent contains "bingbot") or
(http.user_agent contains "DuckDuckBot") or
(http.user_agent contains "YandexBot") or
(http.user_agent contains "Baiduspider") or
(http.user_agent contains "rakko")
User-Agent文字列で、許可したいBotを網羅的に列挙しています。
Action
Skip を選択。
Freeプランでも Skip アクションは使えるようになっています(以前はPro以上限定でしたが仕様変更されました)。
WAF components to skip
以下にチェック:
- ✅ All remaining custom rules
- ✅ All Super Bot Fight Mode Rules
この2つが重要です。特に All Super Bot Fight Mode Rules にチェックを入れないと、Bot Fight Mode がスキップされず、結局ブロックされたままになります。
チェックしない項目(攻撃対策は残す):
- ❌ All rate limiting rules
- ❌ All managed rules
Deploy
「Deploy」ボタンでルールを有効化します。
Bot Fight Mode を再ON
設定画面で Bot Fight Mode のトグルをONに戻します。
動作確認
5分ほど待ってから、再度OGPツールで確認します:
OGP画像が正常に取得できれば完了です。
波及効果:1つの設定で広がる5つの改善
この対策を入れたことで、OGP表示問題の解決にとどまらず、以下のすべてが改善されました:
1. SNSシェア時のOGP表示
X(旧Twitter)、Facebook、LINE、Discord、Slack など主要SNSでリンクをシェアした時に、サムネイル画像が正常に表示されるようになりました。画像付きシェアはクリック率が2〜3倍違うと言われており、SNS流入の改善に直結します。
2. 検索エンジンのクロール正常化
Googlebot、bingbot、Applebot なども Bot Fight Mode の対象になっていた可能性があり、これらを明示的に許可することでクロールが安定します。
3. Google Search Console のデータ取得安定化
GSCはGooglebotでクロールしたデータを元にレポートを生成するため、クロールが安定するとGSCの検索順位データ取得精度が向上します。
4. 被リンク獲得機会の拡大
Pinterest、LinkedIn などでシェアされた際にOGP画像付きで展開されるため、画像経由の被リンクや流入獲得がしやすくなります。
5. SEOツール分析の正常動作
Ahrefs、Screaming Frog などのSEO監査ツールも User-Agent ベースで許可されるため、自分のサイトのSEO分析が詰まらずに完走するようになります。
なぜこの設定で安全なのか
「Botを許可するって、セキュリティ的に大丈夫?」と思われるかもしれません。
このルール設計のポイントは、既知の善良なBotのUser-Agentだけを明示的に列挙している点です。未知のBotや攻撃系のBotは引き続き Bot Fight Mode でブロックされます。
もちろん User-Agent 偽装は可能ですが、CloudflareはBot Management(有料プラン)で User-Agent + IP + 挙動パターンによる検証を行います。Freeプランの Bot Fight Mode でも IP reputation ベースの検知はある程度機能します。
重要なのは、一律ブロックするのではなく、リスクとベネフィットのバランスを取ることです。
教訓
今回の件で得た学びを3つにまとめます:
1. セキュリティ設定は可視性とトレードオフ
Bot Fight Mode は強力なBot対策ですが、善良なBotを巻き込む可能性があります。SEOとSNS流入は現代のWebサービスにとって生命線なので、セキュリティ設定を入れる時は必ずクローラーアクセスへの影響を確認すべきです。
2. 原因特定は「切り分け」が命
今回は以下の順序で切り分けたことで、素早く原因にたどり着けました:
- HTMLソース確認(Bladeテンプレートの問題か?)
- 画像ファイル直接アクセス(配信は正常か?)
- キャッシュ疑惑(Laravel / Cloudflare)
- Bot Fight Mode 一時OFF検証
「何が起きているか」を観察し、「何が起きていないか」を一つずつ潰していくことで、見えない問題が見えてきます。
3. 1つの設定が広範囲に影響する
今回の WAF カスタムルールは、OGP問題の解決目的で追加しましたが、副次的にSEO・検索エンジンクロール・SEOツール・SNS流入すべてに好影響を与えました。
クリティカルパス上の設定ほど、副次効果も大きいということを実感しました。
まとめ
Cloudflare の Bot Fight Mode は有用な機能ですが、デフォルトのままだと SNSクローラーや検索エンジンBotもブロックしてしまうことがあります。
以下の3ステップで恒久対策できます:
- WAF Custom rules で善良Bot許可ルールを追加
- Action は「Skip」、Super Bot Fight Mode Rules をスキップ対象に
- Bot Fight Mode は引き続きON
この設定により、セキュリティを維持しつつOGP・SEO・SNS流入すべてを改善できます。
同じ問題で困っていた方の参考になれば幸いです。
関連リンク
- MotoHub - 運営中のバイクポータルサイト
- Cloudflare WAF Custom Rules ドキュメント
- Cloudflare Bot Fight Mode について


