robots.txtでAllowとDisallowが競合したときの優先順位
Disallow: /admin/ の下に Allow: /admin/help.html を足したのに、狙ったファイルがクロールされない。行を入れ替えてみても変わらない。——順番を疑っている間は、たぶん直りません。
Google のクローラーは、robots.txt の競合をパスの長さで判定するからです。公式ドキュメント「Google による robots.txt の指定の解釈」には、こう書かれています。クローラーは、パスの長さに基づいて、最も限定的なルールを使う。そして、ワイルドカードを含めてルールが競合する場合は、制限の少ないルールを使う。
判定は2段構えです。まず長さで比べる。それでも並んだら、制限の少ないほうが残る。
もうひとつ、外しやすい思い込みがあります。「Allow のほうが強い」——これは違います。公式の例には、Disallow が勝つケースがはっきり載っています。
公式に載っている判定例を、長さで数える
Google は「この URL にはこの行が当たる」と結論まで書いた例を並べています。3つ引いて、パス指定の文字数を数えてみます。
| 書いたルール | 対象URL | 当たる行 | 公式が挙げている理由 |
|---|---|---|---|
allow: /p と disallow: / | https://example.com/page | allow: /p | より限定的だから |
allow: /page と disallow: /*.htm | https://example.com/page.htm | disallow: /*.htm | ルールのパスのほうが長く、URL のより多くの文字に一致するので、より限定的だから |
allow: /page と disallow: /*.ph | https://example.com/page.php5 | allow: /page | ルールが競合する場合、Google は制限の少ないルールを使うから |
1行目は /p が2文字、/ が1文字。長いほうが当たっています。
2行目が、いちばん誤解を壊す例です。/page は5文字、/*.htm は6文字。長い Disallow が勝ちます。公式は理由を「ルールのパスのほうが長く、URL のより多くの文字に一致するので、より限定的だから」と説明しています。Allow を後ろに書き足しても、この結果は変わりません。
3行目は同点です。/page が5文字、/*.ph も5文字。長さで決着がつかないので、2段目の判定に落ちて、制限の少ない allow: /page が残ります。
自分のrobots.txtで判定する5ステップ
数える対象を間違えなければ、机上で読み解けます。
- 対象URLを1本に決める。ディレクトリ単位で考えると競合が見えません。
https://example.com/admin/help.htmlのように、実在するURLを1本置きます。 - そのURLに当たる行だけを抜き出す。当たらない行は競合相手ではありません。
Disallow: /admin/は当たりますが、Disallow: /tmp/は当たらないので判定から外れます。 - 抜き出した行のパス指定の長さを比べる。
/admin/は7文字、/admin/help.htmlは16文字です。公式が2行目の例で/*.htmを6文字として数えているのと同じで、*のような記号も含めて比べます。 - 長いほうが当たる。同点になったときだけ、制限の少ないほう、つまり
Allowが残ります。順番はどこにも出てきません。 - 前提のほうを疑う。長さの比較が合っているのに結果が違うなら、そもそも robots.txt が対象のホストに効いていない可能性があります(次の節)。
ステップ2を飛ばすと、判定はほぼ狂います。当たっていない行を競合相手として数えてしまい、勝てるはずの Allow が負けたように見えるからです。
判定より手前で外れているケース
長さの比較は正しいのに結果が合わない。そういうときは、たいてい前提のほうがずれています。
大文字と小文字は区別されます。 公式は「ルールは大文字と小文字を区別する」と明記し、例として disallow: /file.asp は https://www.example.com/file.asp に適用される、と示しています。URL側の表記が混在しているサイトでは、片方だけが素通りします。
robots.txt は、置いた場所のプロトコル・ホスト・ポートの範囲にしか効きません。 https://example.com/robots.txt のルールが適用されるのは https://example.com/ の中のファイルだけです。https://m.example.com/ のようなサブドメインには効きません。公式は無効な組み合わせとして http://example.com/ や https://example.com:8181/ も挙げています。サブドメインに置いた robots.txt も同じで、そのサブドメインにだけ有効です。
パスの値がないルールは無視されます。 公式は「クローラーは [path] の値がないルールを無視する」と書いています。書いたのに効いていない行があるなら、まずここを疑うのが早道です。なお、robots.txt で何も指定しなければ、すべてのファイルは暗黙的にクロール可能として扱われます。
$ を付けたら、パラメータ付きURLは外れる
公式の「役に立つ robots.txt のルール」には、末尾一致のワイルドカードの例が載っています。
User-agent: Googlebot
Disallow: /*.xls$
これで .xls ファイルをブロックできます。ただし公式は、パターンの後ろに何か(URL パラメータなど)が付くと一致しない、と注意しています。挙げられている例は https://example.com/cats.xls?personality=loki で、このURLは /*.xls$ ではブロックされません。
拡張子で止めたつもりが、パラメータ付きのURLだけ残る。これは長さの判定以前の問題です。
グループの話と混ぜない
Allow と Disallow が並んでいても、競合ではないことがあります。別々のユーザーエージェントのグループにある場合です。
公式の robots.txt サンプルには、こういう並びがコメント付きで載っています。
User-agent: *
Disallow: /includes/
User-agent: Googlebot
Allow: /includes/
コメントに書かれている意図は、/includes/ にある CSS や JavaScript を一般には閉じつつ、レンダリングのために必要な Googlebot には許す、というものです。ここで長さを比べる必要はありません。グループが違うからです。
公式はグループの選び方も明示しています。ひとつのユーザーエージェントが一致できるルールセットは1つだけで、それは最初にマッチする最も限定的なグループです。そして、個別のユーザーエージェントのグループと * のグループは結合されません。同じユーザーエージェントに対して複数のグループがある場合だけ、処理前に1つのグループにまとめられます。
公式が挙げている例はこうです。user-agent: googlebot-news(グループ1)、user-agent: *(グループ2)、user-agent: googlebot(グループ3)が並んでいるとき、Googlebot News はグループ1に従います。最も限定的だからです。
だから、複数のクローラーに同じ制限をかけたいなら、それぞれのグループに同じ行を書く必要があります。片方に書いただけで両方に効いているつもりになるのが、よくある取りこぼしです。まとめてしまう手もあります。公式は、複数のユーザーエージェントを1つのグループにまとめると、そのグループのすべてのルールが列挙したすべてのユーザーエージェントに適用される、と説明しています。
クロールを止めても、インデックスは止まらない
Disallow を検索結果から消すための手段だと思っていると、判定が正しくても目的を外します。
公式は、サイト全体をブロックする例(User-agent: * と Disallow: /)について、状況によってはクロールされていなくてもサイトのURLがインデックスに登録されることがある、と注意しています。robots.txt はクロールを止める仕組みであって、検索結果からの除外を保証する仕組みではありません。
検索結果から確実に外したい場合は、robots.txt でのブロックとは別の手段が必要です。ブロックと noindex を組み合わせようとして詰まっているなら、robots.txtでブロックするとnoindexが効かない理由 のほうが近い話です。
AI学習用クローラーを止めても検索には影響しない
Google-Extended を Disallow にすると順位が下がるのでは、という不安から robots.txt に手を入れられずにいる担当者は少なくありません。ここは公式がはっきり書いています。Google-Extended は、Google 検索へのサイトの掲載に影響せず、Google 検索のランキング要素としても使われません。
書き方は他のクローラーと同じです。公式が Googlebot について挙げているグループの例は、次のような形です。
user-agent: Googlebot
allow: /archive/1Q84
disallow: /archive
この例でも、長い allow: /archive/1Q84 のほうが限定的な指定になっています。判定の考え方は、対象のクローラーが変わっても同じです。なお Google の一般的なクローラーは、自動でクロールする際には常に robots.txt のルールに従う、と説明されています。AIクローラーの扱いは Google-Extendedの設定と検索への影響 にまとめています。
書き終えたあとの確認
公式が案内している robots.txt の作成手順は4段階です。ファイルを作る、ルールを追加する、サイトのルートにアップロードする、そしてテストする。最後のテストが抜けやすいところです。
- ブラウザで
https://example.com/robots.txtを開く。公式が最初に案内している確認方法がこれです。中身が表示されれば、マークアップのテストに進めます。 - Search Console の robots.txt レポートを使う。公式はマークアップの問題を直す手段のひとつとしてこのレポートを挙げています。ただし、すでにサイト上で参照できる robots.txt にしか使えません。
- 判定したいURLを1本ずつ、5ステップで読み直す。長さの比較は手で数えられます。ルールを足したあとほど、当たる行が入れ替わっていないかを確かめる価値があります。
公開前の点検表
| 見るところ | 外していないか | 直し方 |
|---|---|---|
| 対象URL | ディレクトリ単位で考えていないか | 実在するURLを1本決めて判定し直す |
| 競合の相手 | 当たっていない行を数えていないか | そのURLに当たる行だけを抜き出す |
| パスの長さ | 「Allowが強い」と思い込んでいないか | 文字数を数えて、長いほうを当てる |
| 同点のとき | 制限の強いほうを当てていないか | 同点なら制限の少ないほうが残る |
| 大文字・小文字 | URL側の表記が混在していないか | 実際のURLの表記に合わせて書く |
末尾の $ | パラメータ付きURLを想定しているか | $ は後ろに何か付くと一致しない |
| 設置場所 | 別ホスト・別プロトコルに効かせようとしていないか | ホストごとにルートへ置く |
| グループ | 片方のグループにだけ書いていないか | 対象ごとに書くか、1グループにまとめる |
| 目的 | クロール禁止で検索結果から消そうとしていないか | 除外は robots.txt の外の手段で行う |
上から4行目までが、5ステップの判定そのものです。残りは、判定より手前の前提を確かめる行になります。クロールの配分そのものを見直したいなら 小規模サイトでクロールバジェットを気にする必要はあるか も合わせてどうぞ。
出典
