先に要点
- robots.txt で
User-agentにクローラー名を書いたグループを作ると、そのクローラーにはUser-agent: *のグループが一切適用されなくなります。2つのグループは足し算されません。 - そのため、拒否を1行も書いていないグループを足しただけで、そのクローラーだけ制限が外れることがあります。標準ライブラリで再現できるので、この記事で実際に動かした結果を載せます。
- AI関連のクローラーは「検索で引用するため」「利用者が URL を貼ったときに読むため」「モデルの学習のため」で名前が分かれています。全部まとめて拒否すると、引用されるための経路まで閉じます。
- Google は
Google-Extendedについて「検索の登録にもランキングにも影響しない」と明記しています。学習だけ止めて検索は通す、という書き分けが可能です。
robots.txt に1行足しただけのつもりが、別のルールが丸ごと無効になっていることがあります。原因は、クローラー名を名指ししたグループが、ワイルドカードのグループを上書きするという仕様です。結合ではなく置き換えなので、名指ししたグループに書き忘れたルールは、そのクローラーには存在しないことになります。
この記事では、その仕組みを手元で再現した結果と、AIクローラーを止めるときにどこまで止めるべきかを、各社の公式ドキュメントで確認しながら整理します。
グループは結合されず、置き換わる
Google の robots.txt 仕様は、複数のグループが一致したときの解決方法をこう説明しています。クローラーは自分の名前に最も具体的に一致するグループを選びます。そして重要なのが次の一文です。
User agent specific groups and global groups (*) are not combined.
名前を指定したグループと、ワイルドカードのグループは組み合わされません。名指しのグループが存在する時点で、そのクローラーにとって User-agent: * のグループは無いのと同じになります。
同じ名前のグループが複数あるときだけは、それらが内部的に1つに束ねられます。混ざるのは同じ具体性どうしだけ、と覚えると間違えません。
手元で確かめる
Python の標準ライブラリに robots.txt の解釈器が入っているので、追加インストールなしで確認できます。次の3つを比べます。
import urllib.robotparser as rp
cases = {
"A": """User-agent: *
Disallow: /private/
""",
"B": """User-agent: *
Disallow: /private/
User-agent: GPTBot
Crawl-delay: 5
""",
}
for label, txt in cases.items():
p = rp.RobotFileParser()
p.parse(txt.splitlines())
print(label, p.can_fetch("GPTBot", "https://example.com/private/"))
実行した結果です。
| robots.txt | GPTBot は /private/ を取りに行けるか |
|---|---|
| A: ワイルドカードのグループだけ | 取りに行けない |
B: A に Crawl-delay だけのグループを足した |
取りに行ける |
B で追加したのは Crawl-delay の1行だけで、許可を書いた覚えはありません。それでも結果が変わります。GPTBot が読むグループが、ワイルドカードの側から名指しの側へ差し替わり、差し替わった先に Disallow が無いからです。
巡回の間隔だけ調整したい、といった軽い気持ちの追記で起きるので、気づきにくい種類の事故です。名指しのグループを作るなら、そのクローラーに効かせたいルールを、そのグループの中に全部書き直してください。
逆向きの読み違いもある
同じ仕様は、外から見たときの判断も狂わせます。
User-agent: *
Disallow: /
User-agent: OAI-SearchBot
Allow: /
先頭だけ見ると全面拒否に見えます。実際には OAI-SearchBot だけは全ページを取りに行けます。robots.txt を上から数行読んで結論を出すと、逆の意味に読めてしまいます。自動でチェックする仕組みを書くときは、必ず最も具体的なグループを選ぶ処理を実装してください。
AIのクローラーは目的ごとに名前が違う
ここを区別しないまま全部拒否すると、望んでいない副作用が出ます。各社の公開ドキュメントで確認した内容です。
| 目的 | 名前の例 | 拒否すると何が起きるか |
|---|---|---|
| 検索結果や回答での引用 | OAI-SearchBot / Claude-SearchBot / PerplexityBot |
回答の出典として出てこなくなる |
| 利用者が URL を渡したときの取得 | ChatGPT-User / Claude-User / Perplexity-User |
読者が URL を貼っても中身を読めない |
| モデルの学習 | GPTBot / ClaudeBot / Google-Extended |
学習に使われなくなる |
OpenAI は OAI-SearchBot を「ChatGPT の検索機能で web サイトを検索結果に出すためのもの」、GPTBot を「生成AIの基盤モデルの学習に使われる可能性のあるコンテンツを収集するためのもの」と、用途を分けて説明しています。Anthropic も Claude-SearchBot を検索品質の向上、ClaudeBot を学習用と分けています。Perplexity は PerplexityBot と Perplexity-User のどちらも基盤モデルの学習には使わないと明記しています。
Google の Google-Extended は少し性質が違い、独立した User-Agent 文字列を持ちません。制御用のトークンとして robots.txt に書きます。ドキュメントには「Google-Extended は Google 検索への登録に影響せず、検索のランキング要因としても使われない」と書かれています。学習利用だけを外せる、という位置づけです。
学習だけ止めて検索は通す書き方
引用はされたいが学習には使われたくない、という方針なら、名前を分けて書きます。
User-agent: GPTBot
Disallow: /
User-agent: ClaudeBot
Disallow: /
User-agent: Google-Extended
Disallow: /
User-agent: *
Disallow: /admin/
最後のワイルドカードのグループは、上の3つには適用されません。ここまで読んだ内容のとおりです。上の3つは全面拒否なので結果は変わりませんが、もし Disallow: / ではない細かい指定にするなら、/admin/ の行も各グループに書き直す必要があります。
逆に検索用のクローラーには何も書かないでおきます。書かなければワイルドカードのグループが適用されるので、余計な制限が入りません。
robots.txt で守れるものと守れないもの
3つ、押さえておきたい限界があります。
- robots.txt はアクセス制御ではありません。公開された方針表であり、従うかどうかは相手次第です。見られて困る情報は認証や非公開化で守ります
- CDN や WAF が User-Agent で弾いていると、robots.txt をいくら直しても結果は変わりません。robots.txt だけ見て「許可している」と判断せず、配信基盤側の設定も確認します
- 許可したからといって引用されるとは限りません。許可は必要条件であって十分条件ではありません
確認の手順
自分のサイトで見るなら、次の順で進めると早いです。
/robots.txtを開き、名指しのグループが何個あるかを数える- 名指しのグループそれぞれについて、ワイルドカード側に書いてあるルールが漏れていないかを見る
- 上の Python の断片に自分の robots.txt を貼り、止めたいクローラーと通したいクローラーで
can_fetchの結果を確かめる - アクセスログで、検索用のクローラーが実際に来ているかを見る
robots.txt とAIクローラーのよくある質問
Q. AIクローラーは全部拒否した方が安全ですか?
目的によります。AI検索からの流入や引用を期待するなら、検索用のクローラーまで拒否すると経路が閉じます。学習に使われたくないだけなら、学習用のクローラーだけを指定すれば足ります。有料記事や独自データを持つサイトでは、より広く制限する判断もあります。
Q. 名指しのグループに Crawl-delay だけ書くのは危険ですか?
そのグループにルールを書き足さないままにすると、ワイルドカード側の Disallow がそのクローラーに効かなくなります。間隔だけ調整したいときも、効かせたい Disallow を同じグループにもう一度書いてください。
Q. Google-Extended を拒否すると検索順位は下がりますか?
Google のドキュメントは、検索への登録にもランキングにも影響しないと明記しています。学習とグラウンディングの利用可否を制御するトークンという扱いです。
Q. User-Agent は偽装できるのに意味がありますか?
robots.txt に従う相手には意味があります。偽装したアクセスを止めたいなら、robots.txt ではなく IP の検証や配信基盤側の制御が必要です。各社は自社クローラーの IP レンジを公開しているので、照合できます。
まとめ
robots.txt でいちばん事故りやすいのは、グループが足し算されるという思い込みです。クローラー名を書いた瞬間、そのクローラーにとってワイルドカードのグループは存在しなくなります。
そしてAIのクローラーは、引用のためのものと学習のためのものが名前で分かれています。止めたいものだけ名前で指定し、通したいものには何も書かない。この2つを押さえておけば、意図しない全面拒否も、意図しない素通しも防げます。
参考リンク
- robots.txtとは?検索エンジンとAIクローラーに何を伝えるファイルなのか
- AIクローラーとは?Webサイト運用でログとrobots.txtを見る基本
- AI検索に引用されやすい技術記事の書き方とは?
- Google 検索セントラル: robots.txt の書き方
- Google 検索セントラル: Google の一般的なクローラー
- OpenAI: Bots
- Anthropic: Anthropic のクローラーと止め方
- Perplexity: PerplexityBot