SEO Next.js : comment faire citer mon site par ChatGPT ?

Rendez chaque page lisible sans JavaScript, décrivez-la, et laissez entrer le robot de recherche de ChatGPT. Dans Next.js : des Server Components avec le texte dans le HTML, l'API Metadata pour le titre, la canonique et les langues, app/robots.ts qui autorise OAI-SearchBot, app/sitemap.ts et un JSON-LD. Rien de tout cela ne garantit une citation, mais cela supprime les raisons pour lesquelles ChatGPT ne peut pas utiliser votre page.

Données clés

  • OpenAI indique que les sites qui refusent OAI-SearchBot n'apparaîtront pas dans les réponses de la recherche ChatGPT, et qu'une modification du robots.txt peut prendre environ 24 heures. (OpenAI: Overview of OpenAI crawlers)
  • OpenAI indique que bloquer GPTBot signale seulement que le contenu ne doit pas servir à entraîner ses modèles ; les visites de ChatGPT-User sont déclenchées par les utilisateurs et ne servent pas à décider ce qui apparaît dans la recherche. (OpenAI: Overview of OpenAI crawlers)
  • Next.js indique que l'export metadata et generateMetadata, disponibles depuis la v13.2.0, ne fonctionnent que dans les Server Components, afin que les métadonnées figurent dans le HTML initial. (Documentation Next.js : generateMetadata, en anglais)
  • Next.js génère le robots.txt à partir de app/robots.ts depuis la v13.3.0, avec des règles par agent utilisateur. (Documentation Next.js : robots.txt, en anglais)
  • app/sitemap.ts gère les URL alternatives par langue depuis Next.js v14.2.0, et la limite de Google est de 50 000 URL par sitemap. (Documentation Next.js : sitemap.xml, en anglais)

Quel robot OpenAI faut-il autoriser ?

OAI-SearchBot est celui qui décide si la recherche ChatGPT peut afficher votre site. Les trois ont des rôles différents, donc bloquez-les ou autorisez-les séparément.

// app/robots.ts
import type { MetadataRoute } from "next";

export default function robots(): MetadataRoute.Robots {
  return {
    rules: [
      { userAgent: "*", allow: "/" },
      // ChatGPT search : doit être autorisé pour apparaître dans les réponses
      { userAgent: "OAI-SearchBot", allow: "/" },
      // Entraînement des modèles : votre choix, cela ne décide pas de la recherche
      { userAgent: "GPTBot", allow: "/" },
    ],
    sitemap: "https://www.example.com/sitemap.xml",
  };
}
Agent utilisateurCe qu'il faitEffet d'un blocage
OAI-SearchBotExplore les sites pour les fonctions de recherche de ChatGPTVos pages n'apparaissent pas dans les réponses de la recherche ChatGPT
GPTBotExplore les contenus susceptibles d'entraîner les modèles d'OpenAILe contenu n'est pas utilisé pour l'entraînement ; la recherche n'est pas touchée
ChatGPT-UserVisite une page lorsque la question d'un utilisateur en a besoinLe robots.txt peut ne pas s'appliquer ; il ne décide pas de la recherche

Pourquoi le texte doit-il être rendu côté serveur ?

Parce que les robots de ChatGPT lisent le HTML que votre serveur envoie et n'exécutent pas JavaScript. Dans l'App Router, les pages sont des Server Components par défaut ; un texte chargé dans un Client Component après le chargement est absent de ce HTML. Gardez la page en Server Component et ne placez dans des fichiers « use client » que les parties interactives.

Que doivent contenir les métadonnées de chaque page ?

Un titre et une description uniques, une URL canonique et, sur un site multilingue, les versions alternatives par langue. generateMetadata les construit pour chaque page ; Next.js transforme les alternates en liens rel="canonical" et hreflang. Le JSON-LD va dans la page sous forme de balise script simple, avec « < » échappé comme le montre la documentation de Next.js, et doit dire la même chose que le texte visible.

// app/guides/[slug]/page.tsx (un Server Component : pas de "use client")
import type { Metadata } from "next";

export async function generateMetadata({ params }: { params: Promise<{ slug: string }> }): Promise<Metadata> {
  const { slug } = await params;
  const page = await getPage(slug);
  return {
    title: page.title,
    description: page.description,
    alternates: {
      canonical: `/guides/${slug}`,
      languages: { "pt-BR": `/pt/guides/${slug}`, es: `/es/guides/${slug}` },
    },
  };
}

export default async function Page({ params }: { params: Promise<{ slug: string }> }) {
  const { slug } = await params;
  const page = await getPage(slug);
  const jsonLd = { "@context": "https://schema.org", "@type": "Article", headline: page.title };
  return (
    <article>
      <script type="application/ld+json"
        dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd).replace(/</g, "\\u003c") }} />
      <h1>{page.title}</h1>
      <p>{page.answer}</p>
    </article>
  );
}

Comment le tester comme un robot ?

Récupérez la page en ligne sans navigateur et cherchez le texte de la réponse, le titre, la canonique et le JSON-LD. Si le texte n'est pas dans le HTML brut, ChatGPT ne peut pas le citer.

# 1. Le texte est dans le HTML brut (aucun JavaScript exécuté)
curl -s -A "OAI-SearchBot" https://www.example.com/guides/my-page | grep -i "une phrase de la réponse"

# 2. Le titre, la canonique et le JSON-LD sont là aussi
curl -s https://www.example.com/guides/my-page | grep -iE "<title>|rel=\"canonical\"|ld\+json"

# 3. Réponse de robots.txt et du sitemap
curl -s https://www.example.com/robots.txt
curl -s https://www.example.com/sitemap.xml | grep -c "<loc>"

Une configuration parfaite suffit-elle à être cité ?

Non. La configuration rend vos pages lisibles et éligibles ; ChatGPT choisit ses sources selon la qualité de la réponse à la question. Le contenu doit toujours être la réponse la plus claire à ce que demandent vos acheteurs.

Étape par étape

  1. Vérifiez robots. Ajoutez app/robots.ts qui autorise OAI-SearchBot et pointe vers le sitemap ; décidez séparément pour GPTBot.
  2. Gardez les pages côté serveur. Vérifiez que chaque page publique est un Server Component avec son texte principal dans le HTML.
  3. Ajoutez les métadonnées. Utilisez generateMetadata pour un titre, une description, une canonique et les langues alternatives uniques sur chaque page.
  4. Ajoutez le JSON-LD et le sitemap. Affichez le JSON-LD dans la page et listez chaque URL publique dans app/sitemap.ts.
  5. Testez le site en ligne. Lancez les contrôles curl après le déploiement, pas sur localhost.

Erreurs fréquentes

  • Bloquer GPTBot et OAI-SearchBot avec une seule règle alors que seul l'entraînement devait être bloqué.
  • Charger le texte de l'article dans useEffect, si bien que le HTML reçu par un robot est vide.
  • Copier le même titre, la même description ou la même canonique sur chaque page depuis le layout racine.
  • Un JSON-LD qui affirme des choses que la page visible ne dit pas.

Comment easyIndex le résout

easyIndex convient bien à un site Next.js parce que le travail reste dans votre dépôt : votre agent de codage écrit les pages, et easyIndex donne les étapes via MCP, audite chaque page à sa soumission et la vérifie sur le site en ligne ; une étape n'est terminée que sur des preuves qu'il contrôle, et non sur le rapport de l'agent.

Ensuite, le tableau de bord affiche les visiteurs venus des assistants IA par page et les pages lues par les robots IA. Un seul forfait avec toutes les fonctionnalités : 30 $US par site et par mois, avec 7 jours d'essai gratuit pour un seul site.

Questions fréquentes

Dois-je bloquer GPTBot ?

C'est votre choix. OpenAI indique que GPTBot sert à l'entraînement et OAI-SearchBot à la recherche : bloquer GPTBot seul ne vous retire donc pas de la recherche ChatGPT.

Faut-il le Pages Router ou l'App Router ?

Les deux peuvent envoyer du HTML rendu côté serveur. Ce guide utilise l'App Router, où les pages sont des Server Components par défaut et où vit l'API Metadata.

Le llms.txt est-il obligatoire ?

Non. La recherche ChatGPT lit vos pages ; un fichier llms.txt ne remplace pas le texte dans le HTML.

Combien de temps avant qu'une modification du robots.txt soit prise en compte ?

OpenAI indique environ 24 heures pour que ses systèmes de recherche s'ajustent après une mise à jour du robots.txt.

Lire la suite

Dernière vérification le .

SEO Next.js : être cité par ChatGPT