目次を見る09

robots.txtでAllowとDisallowが競合したときの優先順位

Wemiro編集部読了目安 12
robots.txtクロールテクニカルSEOサーチコンソール

Disallow: /admin/ の下に Allow: /admin/help.html を足したのに、狙ったファイルがクロールされない。行を入れ替えてみても変わらない。——順番を疑っている間は、たぶん直りません。

Google のクローラーは、robots.txt の競合をパスの長さで判定するからです。公式ドキュメント「Google による robots.txt の指定の解釈」には、こう書かれています。クローラーは、パスの長さに基づいて、最も限定的なルールを使う。そして、ワイルドカードを含めてルールが競合する場合は、制限の少ないルールを使う。

判定は2段構えです。まず長さで比べる。それでも並んだら、制限の少ないほうが残る。

もうひとつ、外しやすい思い込みがあります。「Allow のほうが強い」——これは違います。公式の例には、Disallow が勝つケースがはっきり載っています。

公式に載っている判定例を、長さで数える

Google は「この URL にはこの行が当たる」と結論まで書いた例を並べています。3つ引いて、パス指定の文字数を数えてみます。

書いたルール対象URL当たる行公式が挙げている理由
allow: /pdisallow: /https://example.com/pageallow: /pより限定的だから
allow: /pagedisallow: /*.htmhttps://example.com/page.htmdisallow: /*.htmルールのパスのほうが長く、URL のより多くの文字に一致するので、より限定的だから
allow: /pagedisallow: /*.phhttps://example.com/page.php5allow: /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ステップ

数える対象を間違えなければ、机上で読み解けます。

  1. 対象URLを1本に決める。ディレクトリ単位で考えると競合が見えません。https://example.com/admin/help.html のように、実在するURLを1本置きます。
  2. そのURLに当たる行だけを抜き出す。当たらない行は競合相手ではありません。Disallow: /admin/ は当たりますが、Disallow: /tmp/ は当たらないので判定から外れます。
  3. 抜き出した行のパス指定の長さを比べる/admin/ は7文字、/admin/help.html は16文字です。公式が2行目の例で /*.htm を6文字として数えているのと同じで、* のような記号も含めて比べます。
  4. 長いほうが当たる。同点になったときだけ、制限の少ないほう、つまり Allow が残ります。順番はどこにも出てきません。
  5. 前提のほうを疑う。長さの比較が合っているのに結果が違うなら、そもそも robots.txt が対象のホストに効いていない可能性があります(次の節)。

ステップ2を飛ばすと、判定はほぼ狂います。当たっていない行を競合相手として数えてしまい、勝てるはずの Allow が負けたように見えるからです。

判定より手前で外れているケース

長さの比較は正しいのに結果が合わない。そういうときは、たいてい前提のほうがずれています。

大文字と小文字は区別されます。 公式は「ルールは大文字と小文字を区別する」と明記し、例として disallow: /file.asphttps://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だけ残る。これは長さの判定以前の問題です。

グループの話と混ぜない

AllowDisallow が並んでいても、競合ではないことがあります。別々のユーザーエージェントのグループにある場合です。

公式の 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-ExtendedDisallow にすると順位が下がるのでは、という不安から 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段階です。ファイルを作る、ルールを追加する、サイトのルートにアップロードする、そしてテストする。最後のテストが抜けやすいところです。

  1. ブラウザで https://example.com/robots.txt を開く。公式が最初に案内している確認方法がこれです。中身が表示されれば、マークアップのテストに進めます。
  2. Search Console の robots.txt レポートを使う。公式はマークアップの問題を直す手段のひとつとしてこのレポートを挙げています。ただし、すでにサイト上で参照できる robots.txt にしか使えません。
  3. 判定したいURLを1本ずつ、5ステップで読み直す。長さの比較は手で数えられます。ルールを足したあとほど、当たる行が入れ替わっていないかを確かめる価値があります。

公開前の点検表

見るところ外していないか直し方
対象URLディレクトリ単位で考えていないか実在するURLを1本決めて判定し直す
競合の相手当たっていない行を数えていないかそのURLに当たる行だけを抜き出す
パスの長さ「Allowが強い」と思い込んでいないか文字数を数えて、長いほうを当てる
同点のとき制限の強いほうを当てていないか同点なら制限の少ないほうが残る
大文字・小文字URL側の表記が混在していないか実際のURLの表記に合わせて書く
末尾の $パラメータ付きURLを想定しているか$ は後ろに何か付くと一致しない
設置場所別ホスト・別プロトコルに効かせようとしていないかホストごとにルートへ置く
グループ片方のグループにだけ書いていないか対象ごとに書くか、1グループにまとめる
目的クロール禁止で検索結果から消そうとしていないか除外は robots.txt の外の手段で行う

上から4行目までが、5ステップの判定そのものです。残りは、判定より手前の前提を確かめる行になります。クロールの配分そのものを見直したいなら 小規模サイトでクロールバジェットを気にする必要はあるか も合わせてどうぞ。

出典

  1. Google による robots.txt の指定の解釈 - Google 検索セントラル
  2. robots.txt ファイルの作成と送信 - Google 検索セントラル
  3. 役に立つ robots.txt のルール - Google 検索セントラル
  4. Google の一般的なクローラー - Google 検索セントラル

NEXT STEP

クライアントへの説明に使える実際の画面を見てみませんか

ご自身の目で、GA4・Search Consoleのデータがどう整理されるかを確認いただけます。

無料デモを見てみる