Webセキュリティ

robots.txtの書き方 — 検索エンジンから管理画面を隠す

この記事の対象者
  • Webサイトを公開しているが robots.txt を設置していない方
  • 管理画面が検索エンジンにインデックスされるのを防ぎたい方
  • robots.txt の基本的な書き方を知りたい方

robots.txt とは

robots.txt は、検索エンジンのクローラーに「どのページをクロールしてよいか」を伝えるファイルです。サイトのルート(https://example.com/robots.txt)に配置します。

重要な注意

robots.txt はあくまで「お願い」であり、悪意のあるクローラーは無視します。機密ページへのアクセス制御には、認証やIP制限を併用してください。

なぜ必要なのか

robots.txt がないと、以下のリスクがあります。

robots.txt なし クローラーが全ページをインデックス
/admin/ が検索結果に表示 攻撃者が管理画面のURLを容易に発見
攻撃対象になる ブルートフォース攻撃やゼロデイ攻撃

基本的な書き方

robots.txt
User-agent: *
Disallow: /admin/
Disallow: /drive/
Disallow: /manage/
Sitemap: https://example.com/sitemap.xml
ディレクティブ 意味
User-agent: * すべてのクローラーに対する指示
Disallow: /admin/ /admin/ 以下をクロールしない
Sitemap: サイトマップの場所を通知

よく使うパターン

全ページをクロール許可

robots.txt
User-agent: *
Disallow:

全ページをクロール禁止

robots.txt
User-agent: *
Disallow: /

特定のクローラーのみ許可

robots.txt
User-agent: Googlebot
Disallow:

User-agent: *
Disallow: /

Djangoでrobots.txtを配信する

Djangoでは、ビュー関数で robots.txt を返す方法が簡単です。

urls.py
from django.http import HttpResponse

def robots_txt(request):
    lines = [
        "User-agent: *",
        "Disallow: /admin/",
        "Disallow: /drive/",
        "Disallow: /manage/",
        f"Sitemap: https://{request.get_host()}/sitemap.xml",
    ]
    return HttpResponse("
".join(lines), content_type="text/plain")

urlpatterns = [
    path("robots.txt", robots_txt, name="robots_txt"),
    # ...
]

静的ファイルとして配置する方法もある

static/ ディレクトリに robots.txt を置き、Nginxで直接配信する方法もあります。ただしDjangoのビューで生成する方が、環境ごとにホスト名を動的に変更できるメリットがあります。

設定を確認する

ターミナル
curl https://example.com/robots.txt
User-agent: *
Disallow: /admin/
Disallow: /drive/
Disallow: /manage/
Sitemap: https://example.com/sitemap.xml

まとめ

  • robots.txt: 検索エンジンにクロール範囲を指示するファイル
  • 必ず設置: 管理画面やプライベートなパスを Disallow に指定
  • 注意: アクセス制御ではないため、認証やIP制限と併用する
  • Django: ビュー関数で動的に生成するのが簡単