← tryx402

Rendre un site lisible par GPTBot : prérendu, SSR hybride et double canal machine

BLUF : GPTBot, ClaudeBot et PerplexityBot téléchargent le HTML brut sans moteur JavaScript. Un site en rendu client pur leur livre une coquille vide de quelques dizaines de mots. Le correctif standard : générer le HTML complet au moment du build. Quelques lignes de configuration, pas une refonte.

Le test de diagnostic

# Ce que voit GPTBot
curl -s -A "Mozilla/5.0 (compatible; GPTBot/1.1)" https://votre-site.com \
| sed 's/<[^>]*>//g' | wc -w

# Comparaison : ce que voit un navigateur (rendu JS)
# Ouvrez la page dans Chrome, F12, console :
document.body.innerText.trim().split(/\s+/).length

Si l'écart entre les deux chiffres dépasse 80%, vos visiteurs IA voient un site fantôme.

Les quatre approches de correction

ApprochePour quel casEffort
Prérendu build-timeSite vitrine, landing, documentationFaible : script de prerender dans le pipeline CI
SSR hybrideApplication avec pages critiques (accueil, pricing)Moyen : framework avec rendu serveur (Next.js, Remix)
Double canal machine-firstTous les sites, en complémentFaible : llms.txt + routes .md
Prérendu à la demande (Puppeteer)Contenu dynamique servi aux crawlers uniquementMoyen : middleware + service de rendu

Exemple 1 : Vite + Puppeteer (build-time)

Dans package.json :

{
  "scripts": {
    "build": "vite build && node prerender.mjs"
  }
}

Le script prerender.mjs charge la page construite dans un headless Chrome et remplace <div id="root"></div> par le HTML rendu :

import { readFileSync, writeFileSync } from 'fs'
import puppeteer from 'puppeteer'

const browser = await puppeteer.launch()
const page = await browser.newPage()
await page.goto('file://' + resolve('dist/index.html'), {waitUntil: 'networkidle0'})
const html = await page.content()
writeFileSync('dist/index.html', html)
await browser.close()

Exemple 2 : Next.js App Router (SSR natif)

Par défaut, le App Router rend côté serveur. Les pièges classiques qui cassent l'extraction :

Le canal machine-first en complément

Un fichier /llms.txt à la racine indexe votre documentation pour les agents :

# Nom du projet
> Description en une phrase.

## Docs
- [Guide principal](https://votre-site.com/docs)
- [Tarifs](https://votre-site.com/pricing)

## Pages comparatives
- [vs concurrent A](https://votre-site.com/vs/a.html)

Ajoutez des routes .md miroir de vos pages clés : même contenu en Markdown pur, servi avec Content-Type: text/markdown.

Checklist finale avant re-crawl

Vérifiez automatiquement votre score d'extraction IA après chaque déploiement.

Tester mon domaine   Budget et délais attendus

← tryx402