
はじめに
こんにちは。SRE マネージャーの izzii です。最近会社でオフィスの引越しがありました。前のオフィスはコワーキングスペースで複数社で空間を分割するようなオフィスだったのですが、フロア丸々テックタッチというのが新鮮です!

さて、私は一年ほど前にウェブセキュリティの文脈でクローラーについて調査することがありました。そこで robots.txt や meta tag に関する不正確であったり古い記事が、検索の上位に紛れ込んでいることに気がつきました。同時に、robots.txt と検索エンジンの関係を不正確に理解している方が少なくないことにも気がつきました。 業界によっては常識かもしれませんが、正確な情報の定着を鑑みるに、我々のような toB サービス事業者のテックブログで本記事を公開することの意義はあるものと考えています。
最近は AI クローラー対策も話題ですが、本記事では対象としません。AI クローラーの管理に興味がある方は 急増するAIクローラー対策として「llms.txt」を導入してみた | Developers IO などを読んでみると面白いかもしれません。またこの記事は robots.txt の有効性自体や SEO に関する話題を取り上げたものではありません。検索結果にウェブページを載せたくないというモチベーションの元での正しいクローラーの制御に関する記事です。昨今 Web サイトの公開に特別な技能が不要になってきていますので、今一度ページの公開と検索エンジンの関係に関する正しい知識を確認しましょう。
robots.txt
robots.txt の基本
まず、robots.txt について簡単におさらいしましょう。robots.txt はウェブサイトのルートディレクトリに配置されるテキストファイルで、検索エンジンのクローラーに対してどのページをクロールして良いか、またはクロールしてはいけないかを指示するために使われます。(robots.txt の概要 | Google 検索セントラル)例えば、特定のディレクトリをクロールさせたくない場合や、特定の検索エンジンにだけクロールを許可したい場合に利用されます。Standards Track で Robots Exclusion Protocol | RFC 9309 が公開されており、幅はあれど行儀の良いクローラーは従ってくれます。
例えば
User-Agent: * Disallow: /private/
この設定は、すべてのクローラーに対して /private/ ディレクトリのクロールを禁止します。しかし、これはあくまで「クロールの指示」であり、インデックス化を防ぐものではありません。
robots.txt の限界
ここで重要なのは、robots.txt はあくまで「クロールの指示」であり、「インデックスの指示」ではないという点です。つまり、robots.txt でクロールを禁止したページであっても、他のページからリンクされている場合、そのURLは検索エンジンのインデックスに含まれる可能性があります。例えば robots.txt でクローラーのアクセスを制限した URL を発行したつもりでも、その URL がリンクされた公開ページにクローラーが到達可能な場合、インデックスの指示がなければ検索結果に表示されることがあります。

X-Robots-Tag
このような状況を防ぐために有効なのが X-Robots-Tag です。X-Robots-Tag は HTTP ヘッダーを利用して、ページのインデックス化を直接制御できます。これにより、特定のページを検索エンジンのインデックスから除外することが可能です。
X-Robots-Tag の仕様
X-Robots-Tag は robots.txt と違って業界の標準仕様は(まだ?)定まっていないようです。現在だと Google が公開する仕様が最も標準に近いものだと思われます。
Robots meta タグ、data-nosnippet、X-Robots-Tag の指定 | Google 検索セントラル
X-Robots-Tag | MDN
例えばある URL にアクセスした際に
X-Robots-Tag: none
が返ることで、検索エンジンはその URL を検索結果に載せなくなるといった次第です。細かい指示子を使って柔軟なコントロールが可能なのですが、検索結果に載せたくないというモチベーションにおいては、指示子の詳細は重要ではないので解説を省略します。 実は X-Robots-Tag ヘッダーよりも先んじて、HTML に対しては meta タグを用いたインデックスのコントロールが可能でした。しかし X-Robots-Tag ヘッダーは HTML に限定されず、実装面においてもプロキシで追加することが容易など、取り回しが良いでしょう。
X-Robots-Tag と robots.txt の組み合わせに注意
X-Robots-Tag よりも robots.txt の指示が優先されます。つまり robots.txt によってクローラーに対してコンテンツを見るなと指示を出すことで、X-Robots-Tag ヘッダーの指示にクローラーが従わないことがあります。robots.txt でクロールは許可する必要があります。GoogleBot はそのような挙動をすると記載があります。robots.txt ルールとインデックス登録および表示に関するルールとの組み合わせ | Google 検索セントラル
例えば以下のレスポンスからは example.com コンテンツのクロールとインデックスを禁じているように見えますが、クロールが禁じられてしまうせいでインデックスの可否が判断できずにコンテンツが検索結果に載ることがあります。
# 例示としての example.com の利用であり、 # 実際の結果とは異なります。 % curl -v "https://example.com/robots.txt" * Host example.com:443 was resolved. . . . < HTTP/2 200 < content-type: text/plain < content-length: 100 < age: 6 < x-robots-tag: none < User-Agent: * Disallow: / * Connection #0 to host example.com left intact
X-Robots-Tag の限界
X-Robots-Tag を無視する検索エンジンもまだまだ多いです。robots.txt は多くの行儀の良いクローラーは従ってくれますが、X-Robots-Tag に従うことを明示しているクローラーはそれよりも多くありません。2025年2月現在、Google、Bing、Yahoo!、Yandex はドキュメントに X-Robots-Tag に関する記載があることを確認しています。一方 DuckDuckGo や Baidu などは X-Robots-Tag に従うことを謳ってはいません。 Google、Bing、Yahoo!、Yandex に対してはインデックスの指示で制御し、その他のクローラーにはクロールの指示で制御するのが現在できる最善策かと考えられます。
How can I get a page on my site out of the Bing index? | Web Master Tools help & how to
特定のウェブページの、インデックスへの登録を拒否 | Yahoo! Japan 検索
Robots meta tag and X-Robots-Tag HTTP header | Yandex Support
Block a site from search engine - DuckDuckGo | Stack overflow
さいごに
最近だと LLM 学習のためのクローラーが robots.txt を無視しているという話もあります。上述の通りインデックス指示が効かない検索エンジンも存在するので、 robots.txt や X-Robots-Tag で制御できることは当然ですが完璧ではありません。ただし、リスクと対策のバランスが取れていれば、robots.txt や X-Robots-Tag で守れるものもたくさんあると考えています。検索エンジンは、ウェブサービスとユーザーを繋ぐ大事な入り口の一つなので、見せるものと見せないものを管理することには大きな価値があるでしょう。
参照
急増するAIクローラー対策として「llms.txt」を導入してみた | Developers IO
robots.txt の概要 | Google 検索セントラル
Robots Exclusion Protocol | RFC 9309
Robots meta タグ、data-nosnippet、X-Robots-Tag の指定 | Google 検索セントラル
X-Robots-Tag | MDN
How can I get a page on my site out of the Bing index? | Web Master Tools help & how to
特定のウェブページの、インデックスへの登録を拒否 | Yahoo! Japan 検索
Robots meta tag and X-Robots-Tag HTTP header | Yandex Support
Block a site from search engine - DuckDuckGo | Stack overflow