Webサイトのクロールを制御する robots.txt
。その記述方法について、「Allow
ディレクティブは、包括的なDisallow
より先に書くべきだ」という指摘を受けたことはありませんか?
このプラクティスは多くの現場で“常識”として扱われていますが、その技術的な背景を正確に理解しているでしょうか。
結論から言うと、この指摘は 「最新のRFCに準拠したクローラだけを考慮するなら誤り」 であり、 「あらゆるクローラとの互換性を最大化する観点では正しい」 と言えます。
本記事では、この一見矛盾した結論の背景にあるrobots.txt
の解釈ルールと、実務におけるベストプラクティスをご紹介します。
現在、GoogleやBingといった主要な検索エンジンが準拠している robots.txt
の仕様は、RFC 9309 (Robots Exclusion Protocol) として標準化されています。
この仕様におけるルールの適用優先順位は、ディレクティブの記述順ではありません。以下のルールで決定されます。
Allow
と Disallow
をすべて評価します。Allow
が Disallow
よりも優先されます。例えば、以下の2つの robots.txt
は、RFC 9309に準拠したクローラにとっては全く同じ意味になります。
# パターンA: Disallowが先
User-agent: *
Disallow: /
Allow: /assets/
# パターンB: Allowが先
User-agent: *
Allow: /assets/
Disallow: /
どちらのパターンでも、/assets/styles.css
というURLを評価する場合、Disallow: /
(パス長: 1)よりも Allow: /assets/
(パス長: 7)の方が具体的であるため、/assets/
ディレクトリへのクロールは許可されます。
Googleの公式ドキュメントもこの「具体性」に基づく評価ロジックを説明しており、行の順序については言及していません。つまり、主要な検索エンジンを対象とする限り、Allow
と Disallow
の順序はクロールの結果に影響を与えないのです。
この慣習の背景には、robots.txt
の歴史と、世の中に存在する多様なクローラの存在があります。
robots.txt
の解釈ルールには、歴史的に大きく2つの方式が存在しました。
具体性ルール (Specificity) 前述の通り、現在の標準であり、Googleなどが採用している方式です。パスの長さで優先度を決定します。
最初の一致ルール (First Match) 古い、あるいは独自実装のシンプルなクローラが採用していた方式です。ファイルを上から順に読み、URLに最初に一致したルールを適用して評価を終了します。
この「最初の一致」ルールのクローラにとって、記述順は決定的に重要です。先ほどのパターンAを見てみましょう。
# パターンA: Disallowが先
User-agent: *
Disallow: / # ←ここで全てが一致してしまう
Allow: /assets/ # ←この行は評価されない
このクローラが /assets/styles.css
を評価すると、最初の Disallow: /
に一致した時点で「クロール不可」と判断し、後続の Allow: /assets/
は無視されてしまいます。結果として、意図せずサイト全体のクロールを拒否することになります。
このような悲劇を避けるため、あらゆるクローラで意図通りに動作させるための防衛的な記述として、「例外的な許可(Allow
)を先に書き、包括的な拒否(Disallow
)を後に書く」というプラクティスが生まれ、広まってきたのです。
以上の背景を踏まえると、私たちの取るべきアクションは明確です。
対象 | 順序の影響 | 推奨される書き方 |
---|---|---|
Google/Bingなど主要検索エンジン | 影響なし | どちらでも可 |
古いクローラや未知のボット | 影響を受ける可能性大 | Allow → Disallow の順が安全 |
コードの可読性・メンテナンス性 | 人間の解釈しやすさ | 「例外を先に、一般ルールを後に」と書くAllow → Disallow の方が直感的 |
robots.txt
の Allow
/Disallow
の記述順について、改めてポイントを整理します。
Allow
)を先に、一般(Disallow
)を後に」という順序は理にかなっています。したがって、「順序を変えないと動かない」という指摘は技術的には不正確な場合がありますが、最大限の互換性を確保し、意図しない挙動を防ぐための極めて有効なアドバイスであると言えます。特別な理由がない限り、この安全なプラクティスに従うと良いのではないでしょうか。
以上、改めて robots.txt
の仕様について学び直した、現場からお送りしました。