Pourquoi maîtriser robots.txt ?
Un robots.txt mal configuré peut désindexer tout votre site en quelques heures. Inversement, bien utilisé, il bloque les bots inutiles (scrapers, IA d’entraînement) et économise votre budget de crawl Google. C’est le premier fichier que regarde tout bot qui visite votre domaine.
Emplacement et syntaxe
Le fichier robots.txt se place à la racine du domaine : https://example.sn/robots.txt. Il n’est pas case-sensitive pour le nom mais l’est pour les chemins.
User-agent: *
Disallow: /wp-admin/
Disallow: /cart/
Disallow: /checkout/
Allow: /wp-admin/admin-ajax.php
Sitemap: https://example.sn/sitemap.xml
Directives par bot
User-agent: Googlebot
Disallow: /admin/
Allow: /
User-agent: GPTBot
Disallow: /
User-agent: Claude-Web
Disallow: /
User-agent: bingbot
Crawl-delay: 10
Disallow: /search
User-agent: *
Disallow: /api/private/
Les User-agents à connaître
Moteurs: Googlebot, Googlebot-Image, bingbot, DuckDuckBot, YandexBot, Baiduspider
IA scrapers: GPTBot, ClaudeBot, Claude-Web, anthropic-ai, CCBot, Google-Extended, PerplexityBot
Réseaux: facebookexternalhit, Twitterbot, LinkedInBot
SEO tools: AhrefsBot, SemrushBot, MJ12bot, DotBot
Bloquer les IA de l’entraînement (tout en gardant Googlebot)
User-agent: GPTBot
Disallow: /
User-agent: ClaudeBot
Disallow: /
User-agent: CCBot
Disallow: /
User-agent: Google-Extended
Disallow: /
User-agent: PerplexityBot
Disallow: /
User-agent: *
Allow: /
Wildcards et ancrage
User-agent: *
Disallow: /*.pdf$ # bloque tous les PDF
Disallow: /*?sessionid= # bloque les URLs avec param sessionid
Disallow: /tmp/ # répertoire entier
Allow: /tmp/public/ # exception dans tmp
Servir robots.txt en Next.js
// app/robots.ts
import type { MetadataRoute } from "next";
export default function robots(): MetadataRoute.Robots {
return {
rules: [
{ userAgent: "*", allow: "/", disallow: ["/api/", "/admin/"] },
{ userAgent: "GPTBot", disallow: "/" },
{ userAgent: "ClaudeBot", disallow: "/" },
],
sitemap: "https://example.sn/sitemap.xml",
host: "https://example.sn",
};
}
Nginx qui réécrit dynamiquement
location = /robots.txt {
default_type text/plain;
return 200 "User-agent: *\nDisallow: /api/\nSitemap: https://$host/sitemap.xml\n";
}
Erreurs classiques
❌ Disallow: / # bloque tout le site (à faire en prod par erreur)
❌ Disallow: * # syntaxe invalide, ignorée
❌ Allow: / + Disallow: / # ambiguïté
❌ Robots.txt invalide UTF-8 # encoder en UTF-8 sans BOM
❌ robots.txt > 500 KB # Google ignore au-delà
❌ Redirection 301 de robots.txt # risque d'être ignoré
Tester avec Google
# Outil Testeur robots.txt (ex-Search Console, déprécié 2023)
# Actuellement: URL Inspection dans Search Console pour vérifier
# chaque URL individuellement
# Validation programmatique
curl -A "Mozilla/5.0 (compatible; Googlebot/2.1)" https://example.sn/robots.txt
# Test par Python (robotparser)
python - <<'EOF'
from urllib.robotparser import RobotFileParser
rp = RobotFileParser()
rp.set_url("https://example.sn/robots.txt")
rp.read()
print(rp.can_fetch("Googlebot", "https://example.sn/admin")) # False
print(rp.can_fetch("*", "https://example.sn/produit/42")) # True
EOF
Différence avec noindex
robots.txt Disallow: empêche le CRAWL (Google ne télécharge pas)
→ l'URL peut quand même apparaître dans les résultats sans description
<meta name="robots" content="noindex">: interdit l'INDEXATION
→ requiert que le bot puisse crawler la page pour voir le noindex !
→ donc si on veut noindex, il faut PAS bloquer via robots.txt
→ noindex est plus efficace pour masquer complètement
Règle: pour cacher une page des résultats, utiliser noindex et LAISSER le crawl.
Pour aller plus loin
- Sitemap XML
- Configurer Search Console
- Spec officielle : RFC 9309 — Robots Exclusion Protocol
- Doc Google : Google — Introduction to robots.txt
- Liste bots IA : darkvisitors.com