ジャーナル

日本のサイト248件中23件、robots.txtは許可でもAIクローラーには403

Trancoの日本のサイト300件を2026-10-07に確認しました。普通に読めた248件のうち23件で、robots.txtが許可しているAIクローラーのUser-Agentに403が返りました。クローラー別の件数、断り方の3つの形、分野ごとの例、確かめ方と限界。

この記事は最初に dev.to で公開されました。正規の版はそちらです。

日本のサイトで、robots.txtはAIクローラーを許可しているのに、サーバーの手前(CDNやWAF)ではそのクローラーに403を返している、という食い違いがどれくらいあるのかを数えました。2026-10-07の朝、Trancoのリストに載っている日本のサイト300件を1件ずつ確認したところ、ブラウザとして普通にページが返ってきた248件のうち23件で、robots.txtでは許可されているAIクローラーのUser-Agentに403が返りました。

この記事は、その数字と内訳、層ごとの例、そしてこの測り方でわからないことです。

先に限界(2026-10-07時点)

  • User-Agentを名乗っただけです。 送ったのは各社が公開しているUser-Agentの文字列で、送り元は私の普通の回線です。本物のクローラーは各社のIPアドレスから来ます。CDNのボット対策には、IPで本物と確認できたクローラーと、名前を真似ただけのリクエストを別に扱うものがあります。ここでの403は「このUser-Agentを名乗ると断られる」という意味で、「本物のGPTBotが断られている」の証明ではありません。
  • 場所は1か所です。 日本の家庭用回線1本から送りました。国や回線によって応答を変えるサイトもあります。
  • 1回のスナップショットです。 2026-10-07 08:19〜09:12(日本時間)に1回ずつ取得し、403になった23件だけを09:13〜09:15にもう一度確認しました。設定は日々変わります。
  • トップページだけです。 下層ページやAPIは見ていません。
  • 意図はわかりません。 学習用クローラーを止めるのは正当な選択です。ここで数えているのは、robots.txtとサーバーの手前の層が別のことを言っている件数で、どちらが意図どおりかはサイトの方にしかわかりません。

対象と測り方

  • リスト: Trancoのリスト56WKN(2026-10-05生成、100万件)。これまでの記事と同じリストです。
  • 対象300件: リストの中の.jpドメインを順位の高いほうから288件(最下位は15,883位)。それに、日本向けのサイトを.comで運営していると確認できた12件(nikkei.com、asahi.com、sankei.com、jiji.com、kakaku.com、tabelog.com、cookpad.com、mercari.com、dmm.com、fc2.com、livedoor.com、yodobashi.com)。日本企業でも海外向けの.comは入れていません。
  • リクエスト: 1件ずつ順番に、間を0.3秒あけ、タイムアウト10秒、リダイレクトは追いました。robots.txtは自分の名前を名乗るUser-Agent(glovrex-measure/1.0)で取得。トップページは、ブラウザ(Chrome)→ GPTBot → OAI-SearchBot → ClaudeBot → PerplexityBot → もう一度ブラウザ、の順に6回取得しました。apex(example.jp)が応答しなかった97件はwww.付きで取り直しています。
  • Google-Extendedはrobots.txtの中の名前だけで、それを名乗るクローラーは存在しません(取得はGooglebotが行います)。なのでrobots.txtの集計にだけ入れ、サーバーの応答は測っていません。
  • 「サーバーの手前で断る」の定義: robots.txtがそのクローラーにトップページ(/)を許可している、ブラウザの2回がどちらも200、そのクローラーのUser-Agentには401か403。robots.txtが404などの4xxのときは、RFC 9309にしたがって「制限なし」として扱いました。
  • 判定に使ったスクリプトは依存なしの.mjs1本で、robots.txtの判定はRFC 9309の最長一致です。

数字

300件のうち、ブラウザの2回がどちらも200だったのは248件です。残り52件は、どちらの名前でも応答がない、ブラウザにもチャレンジページ(202など)や403を返す、といったサイトで、比較ができないので外しています。

robots.txtの取れ方は次のとおりです。

robots.txt 件数
テキストのファイルが返った 183
200でHTMLページが返った 29
4xx(ファイルなし扱い) 47
応答なし 40
5xx 1

robots.txtでトップページを拒否している件数(読めた259件中)は、GPTBot 25、OAI-SearchBot 17、ClaudeBot 21、PerplexityBot 18、Google-Extended 24でした。

そして本題です。robots.txtでは許可されているのに、そのUser-Agentに403が返ったサイトは248件中23件でした。クローラーごとの件数はこうです。

クローラー robots.txtは許可、サーバーは403
GPTBot 22
ClaudeBot 19
PerplexityBot 16
OAI-SearchBot 15

23件のうち14件は、4つのUser-Agentすべてに403を返しました。23件は09:13〜09:15の再確認でも、最初に403だったUser-Agentにすべて403のままでした。

23件のrobots.txtの状態

「robots.txtが許可」の中身は均一ではありません。

23件のrobots.txt 件数
ファイルがあり、そのクローラーを許可している 13
robots.txt自体が私の計測用User-Agentに403 7
robots.txtが404 2
robots.txtの場所でHTMLが返った 1

13件は、robots.txtのファイルに「来ていい」と読める内容が書かれていて、その手前の層が断っている、いちばんはっきりした食い違いです。7件は、robots.txt自体が名乗った計測用のUser-Agentに403でした。規格上は「制限なし」扱いですが、実際にはボットらしいリクエスト全般を手前で止めている可能性が高い形です。

断っている対象で3つに分かれる

23件に、AIではないUser-Agentを3つ(名乗った計測用、curl、Googlebotの文字列)追加で送りました。

形 件数 何が言えるか
A. 計測用もGooglebotの文字列も200、AIのUser-Agentだけ403 9 AIクローラーの名前を指定したルールがある
B. 計測用は200、Googlebotの文字列も403 8 有名なボットの名前を、確認できないIPから名乗るリクエストを断っている可能性がある。この場合、本物のクローラーは通っているかもしれない
C. 計測用のUser-Agentも403 6 ブラウザ以外のアクセス全般を断っている

Aの9件では、403だったのはGPTBotが9件、ClaudeBotが6件、PerplexityBotとOAI-SearchBotが2件ずつでした。学習用のクローラー(GPTBot、ClaudeBot)を名指しし、検索用のOAI-SearchBotは通している形が多いということです。robots.txtで学習用だけ止めたい場合とやりたいことは同じですが、robots.txtには書かれていません。

ドメインの種類別

種類 普通に読めた件数 うち食い違い
.co.jp 70 9
.jp(汎用) 130 9
.go.jp 17 4
.ne.jp 9 1
日本向けの.com 12件 10 0
.ac.jp、.or.jp、.ad.jp 12 0

レスポンスヘッダーから見たサーバーの手前の層は、Akamaiが8件、CloudFrontが6件、Cloudflareが1件、ヘッダーからは判別できないもの(nginxやAWSのロードバランサーなど)が8件でした。特定のCDNに偏った現象ではありません。

分野ごとの例

以下は測定時点で観測した応答の記録で、設定の良し悪しの評価ではありません。どれも意図した設定である可能性があります。

  • 交通・旅行: jorudan.co.jpは、robots.txtのファイルがあり、GPTBot、ClaudeBot、PerplexityBotに403、OAI-SearchBotには200でした(形A)。jtb.co.jpはGPTBotだけが403で、ほかの3つは200(形A)。jreast.co.jpは、robots.txtも計測用のUser-Agentに403で、ブラウザ以外を広く断っている形(形C)。
  • メディア・出版: yanmaga.jpはGPTBotだけが403(形A)。trafficnews.jpはGPTBotとClaudeBotが403で、検索用の2つは200(形A、Cloudflare)。kabutan.jpは4つとも403、Googlebotの文字列は200(形A)。
  • EC・小売: creema.jpとtower.jpは、GPTBotとClaudeBotが403、OAI-SearchBotとPerplexityBotが200(形A)。melonbooks.co.jpはrobots.txtが404で、PerplexityBot以外の3つが403(形A)。buyee.jpは4つとも403で、Googlebotの文字列も403(形B)。
  • 行政: moj.go.jpはGPTBotだけが403(形A)。e-gov.go.jpとmeti.go.jpは4つとも403で、Googlebotの文字列も403(形B)。mofa.go.jpは計測用のUser-Agentも403(形C)。
  • 金融ほか大手企業: mizuhobank.co.jpとsuntory.co.jpは、どちらも計測用のUser-Agentも403(形C、Akamai)。smbcnikko.co.jpは4つとも403で、Googlebotの文字列も403(形B)。

自分のサイトを確かめる

bashで次のように確かめられます(WindowsならGit BashかWSL)。URLをご自身のサイトに置き換えてください。

URL=https://example.com/
while IFS='|' read -r NAME UA; do
  curl -s -o /dev/null -L -w "%{http_code}  $NAME\n" -A "$UA" "$URL"
done <<'EOF'
browser|Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0 Safari/537.36
GPTBot|Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; GPTBot/1.1; +https://openai.com/gptbot)
OAI-SearchBot|Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; OAI-SearchBot/1.0; +https://openai.com/searchbot
ClaudeBot|Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
PerplexityBot|Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; PerplexityBot/1.0; +https://perplexity.ai/perplexitybot)
EOF
curl -s "${URL}robots.txt" | head -40

ブラウザが200でボットが403なら、robots.txtの内容と見比べてください。食い違っていれば、勝つのはサーバーの手前の層です。ただし上の形Bのように、CDNが本物のクローラーをIPで見分けている場合は、curlの結果と本物の扱いが違うことがあります。いちばん確かなのはサーバーやCDNのアクセスログで、GPTBotやClaudeBotで絞り込んでステータスを見てください。層ごとの見分け方は以前の記事に書きました。

403が返っていないことは、AIの回答にサイトが出ることの約束にはなりません。この確認でわかるのは、読みに来たクローラーが入口で止まっていないかどうかだけです。


1サイトを人の手で見てほしい場合は、GEO Mini Auditで、この確認を含むミニ診断を、そのまま貼れる修正案付きでお渡ししています(AIエンジンへの問い合わせや、引用・順位の測定はしません)。