ジャーナル

robots.txtはGPTBotを許可、サーバーは403を返す

日本の観光系の小規模サイトのうち到達できた23件(無作為抽出ではありません)で、6件がrobots.txtでは許可しているGPTBotやClaudeBotをサーバーで拒否していました。curlで1分で確かめる方法と、この確認でわからないこと。

小さなお店や宿のサイトがAIの回答エンジンからどれくらい読めるかを調べていて、同じ食い違いに何度も当たりました。robots.txtはGPTBotとClaudeBotを許可している。なのにサーバーは、そのクローラーに403を返している。

robots.txtを読むだけでは気づけません。robots.txtのチェッカーも「AIクローラーは許可されています」と答えます。拒否はその一段下、Webサーバーかセキュリティ系のプラグインで起きていて、User-Agentの文字列を見て弾いています。

先に限界を書いておきます

  • 対象は、2026-10-04に調べた日本の観光系の小規模事業者のサイト26件です。ゲストハウス、料理教室、着物レンタル、陶芸や茶道の体験教室など。検索やAIへの質問で見つけたサイトなので、無作為抽出ではなく手近に集めたサンプルです。
  • 各サイトにはUser-Agentごとに1回ずつ、日本の家庭用回線1本からリクエストしました。
  • 送ったのは各社が公開しているUser-Agentの文字列で、送り元は普通のIPです。本物のクローラーは各社のIPアドレスから来ます。
  • 到達できたのは23件です。この割合を「中小企業のサイト全般」に広げることはできません。

測った結果

26件のうち3件は応答がなく(タイムアウトや接続エラー)、残りは23件でした。

その23件のうち5件は、ブラウザのUser-Agentには200を返し、GPTBotとClaudeBotの両方には403を返しました。5件ともrobots.txtでは両方を許可しています。さらに1件が、ClaudeBotにだけ403を返しました。こちらは読めるrobots.txtがありません。

同じ5件は、OAI-SearchBotとPerplexityBotには200を返しています。ボット全般ではなく、学習用のクローラーを名前で狙ったルールです。5件のうち4件はServer: nginxを返していて、その4件ではGPTBotとして/robots.txtを取りに行っても403でした。「来ていい」と書いたファイルそのものを、そのクローラーには渡していないわけです。

まとめると、このサンプルでは到達できた23件のうち6件(およそ4分の1)が、2つの学習用クローラーの少なくとも一方をサーバーで拒否していて、どのサイトもそれをrobots.txtには書いていません。割合より形のほうが役に立ちます。自分のサイトなら1分かからずに確かめられます。

curlで自分のサイトを確かめる

各クローラーが公開しているUser-Agentの文字列を使います。https://example.com/をご自身のサイトのURLに置き換えてください。bash用のコマンドなので、WindowsならGit BashかWSLで実行してください。

URL=https://example.com/
BROWSER='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128 Safari/537.36'
GPTBOT='Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; GPTBot/1.1; +https://openai.com/gptbot)'
CLAUDEBOT='Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)'

curl -s -o /dev/null -w 'browser   %{http_code}\n' -A "$BROWSER"   "$URL"
curl -s -o /dev/null -w 'GPTBot    %{http_code}\n' -A "$GPTBOT"    "$URL"
curl -s -o /dev/null -w 'ClaudeBot %{http_code}\n' -A "$CLAUDEBOT" "$URL"
curl -s -o /dev/null -w 'robots.txt as GPTBot %{http_code}\n' -A "$GPTBOT" "${URL}robots.txt"

私が運営しているglovrex.com(Vercelでホスト、robots.txtは全員に許可、サーバー側にUser-Agentのルールなし)では、4行とも200になります。

browser   200
GPTBot    200
ClaudeBot 200
robots.txt as GPTBot 200

サンプルのnginxの4件では、こう出ました。

browser   200
GPTBot    403
ClaudeBot 403
robots.txt as GPTBot 403

2つ目の形が出たら、curl -s "${URL}robots.txt"も実行して、robots.txtに実際に何と書いてあるかを読んでください。robots.txtが許可していてサーバーが拒否しているなら、2つの層が食い違っていて、勝つのはサーバーです。robots.txtの行が404なら問題ありません。robots.txtがないというだけです。nginxの4件は-A GPTBotとだけ送っても同じく403だったので、User-Agentを単純な部分一致で見ているのだと思います。

AIの回答にとって何が変わるか

AIアシスタントがあるお店について何か言うとき、経路は2つあります。1つは、質問を受けたその場でWebを検索する経路で、OAI-SearchBotやClaude-SearchBotのようなクローラーを使います。もう1つは、モデルが学習の段階で取り込んだ知識から答える経路です。GPTBotやClaudeBotが関わるのはこちらです。

上の5件は検索時のクローラーは通しているので、ブラウズするアシスタントなら読めます。失っているのは2つ目の経路です。モデルが検索せずに答えるとき、そのお店のことは、お店に触れている他のページ、たいていは予約サイトやまとめ記事、口コミサイトを通してしか知りません。このグループのゲストハウス1軒で試しに確認したところ、そのお店についてのAIの回答が出典にしていたのは予約サイトだけで、示された料金も公式サイトではなく予約サイトのものでした。1つのエンジンの1回の回答なので、原因の証明にはなりません。ただ、公式サイトが学習データから抜けていれば起きそうなことではあります。

何かを変える前に

学習用クローラーを止めるのは正当な選択です。意図して止めているサイトはたくさんありますし、クローラーを運営する各社も、まさにそのためにオプトアウトの方法を公開しています。ここで問題にしているのは、誰も選んでいない場合だけです。robots.txtはクローラーを許可するように書かれているのに、ホスティングの既定設定やセキュリティプラグインが、誰も気づかないうちにそれを上書きしていた場合です。

私のテストは、公開されているUser-Agentを普通のIPから送っただけです。Cloudflareのボット設定のように、本物と確認できたクローラーと、User-Agentを真似ただけのリクエストを別に扱う仕組みもあります。5件のうち1件はCloudflareの背後にあるので、その1件については、本物のクローラーが受け取る結果と私の結果が違うかもしれません。確実なのはサーバーのアクセスログです。GPTBotとClaudeBotで検索して、ステータスコードを見てください。

サーバーが200を返していても、AIの回答に名前が出る約束にはなりません。誰の名前が挙がるかは、今もほとんどがサイトの外での評判で決まります。この確認で外せるのは、出てこない理由のうちの1つだけです。

どの層(CDN、Webサーバー、プラグイン)が拒否しているかの見分け方と、層ごとの直し方は続きの記事に書きました。

ツールで確かめる場合

curlを使わずに確かめたいなら、無料のAIクローラーチェックにURLを入れると、GPTBot、ClaudeBot、PerplexityBotについて、robots.txtの内容とサーバーの実際の応答を並べて見られます。入力したURLは保存しません。

1サイトを人の手で一通り見てほしい場合は、同じページから9,800円のミニ診断を申し込めます。確認するのはAIクローラーのアクセスと機械可読性(構造化データ、hreflang、metaタグ、サイトマップ、llms.txtなど)で、優先順の改善リストをお渡しします。ChatGPTなどのAIエンジンには質問を送らないので、AIの回答に出てくるかどうかはわかりません。わかるのは、AIがサイトを読めるかどうかです。