Guide SEO Next.js : choisir SSG, SSR ou ISR, définir métadonnées et canoniques, générer sitemap.xml, alimenter un blog par webhook et rester lisible par les IA.

En bref
Next.js est l'un des meilleurs frameworks React pour le référencement, car il envoie aux robots un HTML complet au lieu d'une coquille vide. Pour vous positionner, prérendez les pages de contenu (génération statique ou ISR), définissez titres, descriptions et canoniques avec la Metadata API, générez sitemap.xml et robots.txt depuis le dossier app, utilisez de vrais liens et des codes HTTP corrects, et gardez le contenu principal hors du code exécuté seulement dans le navigateur, car la plupart des robots des IA n'exécutent pas JavaScript.
Pour aller plus loin, demandez à
Quiz rapide
Le SEO est-il fait pour vous, et comment commencer ?
4 questions rapides pour voir si Google peut vous amener des clients.
Notre conseil pour vous
Sorank est la bonne solution pour vous
Les gens cherchent ce que vous vendez et vous pouvez attendre quelques mois : Sorank trouve les bonnes recherches, rédige et publie les articles, et vous obtient des liens.
Sorank correspond à vos réponses
Testez-le 3 jours sur votre propre site, ou commencez par un audit gratuit pour savoir où vous en êtes.
3 jours offerts, puis vous arrêtez quand vous voulez. Satisfait ou remboursé pendant 90 jours.
Le SEO Next.js consiste surtout à faire le bon choix route par route : ce qui est rendu sur le serveur, ce qui est mis en cache, et ce qui arrive dans le HTML avant l'exécution du moindre script. Google explique dans ses bases du SEO JavaScript qu'il traite les applications JavaScript en trois phases (exploration, rendu, indexation) et que le rendu côté serveur ou le prérendu « reste une excellente idée ». Next.js le fait par défaut. Ce guide couvre l'App Router (Next.js 13 et suivants), avec des remarques pour l'ancien Pages Router.
Oui. Une application React classique rendue côté client envoie un fichier HTML presque vide et construit la page dans le navigateur ; les moteurs doivent l'exécuter, et beaucoup de robots ne le font jamais. Next.js rend React sur le serveur : la réponse HTML contient déjà les titres, le texte, les liens et les métadonnées. Notre guide du SEO JavaScript explique pourquoi cette différence compte pour l'indexation.
Dans l'App Router, les composants sont des Server Components par défaut. Même les composants marqués 'use client' sont prérendus en HTML sur le serveur. Le point faible, ce sont les données : tout ce que vous chargez dans useEffect, ou seulement après un clic, est absent du HTML initial. Récupérez le contenu dans des Server Components et réservez les composants client à l'interactivité.
Next.js permet de mélanger les modes route par route. Le choix influe sur la fraîcheur, la vitesse et ce que reçoivent les robots.
| Mode | Quand le HTML est construit | Verdict SEO | Usage idéal |
|---|---|---|---|
| Génération statique (SSG) | Au moment du build | Le meilleur : HTML complet, très rapide | Pages d'atterrissage, documentation, articles de fond |
| Régénération statique incrémentale (ISR) | Au build, puis rafraîchi en arrière-plan ou à la demande | Le meilleur pour les sites gros ou changeants | Blogs, catalogues produits, pages issues d'un CMS |
| Rendu côté serveur (SSR) | À chaque requête | Bon : HTML complet, dépend de la vitesse du serveur | Pages personnalisées ou en temps réel |
| Rendu côté client (CSR) | Dans le navigateur | Faible : contenu invisible pour la plupart des robots | Tableaux de bord derrière une connexion |
La documentation Next.js sur l'ISR en liste les avantages : mettre à jour du contenu statique « sans reconstruire tout le site » et gérer un grand nombre de pages sans builds interminables. Une route avec export const revalidate = 3600 est régénérée au plus une fois par heure ; pour un contrôle exact, appelez revalidatePath ou revalidateTag quand le contenu change. L'ISR ne fonctionne pas avec un export statique (output: 'export'). Pour les applications qui doivent rester rendues côté client, notre guide du SEO des applications monopages détaille les solutions.
Astuce
Vérifiez ce que reçoivent les robots, pas ce qu'affiche votre navigateur : lancez curl sur l'URL ou ouvrez le code source (view-source) et cherchez une phrase de l'article. Si elle n'est pas dans le HTML brut, elle dépend de JavaScript.
La Metadata API remplace next/head dans l'App Router. Selon la documentation Next.js sur les métadonnées, vous exportez un objet metadata statique depuis un layout ou une page, ou une fonction generateMetadata quand les valeurs dépendent de données, et Next.js génère les balises du head. Les deux ne sont pris en charge que dans les Server Components.
export async function generateMetadata({ params }) {
const { slug } = await params
const post = await getPost(slug)
return {
title: post.title,
description: post.excerpt,
alternates: { canonical: `/blog/${slug}` },
openGraph: { images: [post.cover] },
}
}Cinq règles qui évitent la plupart des problèmes :
Sur les pages dynamiques, Next.js diffuse les métadonnées en flux après les premiers octets pour accélérer l'affichage. La documentation précise que ce flux est désactivé pour les robots qui attendent les métadonnées dans le head, détectés par leur user agent (Bingbot, Twitterbot et Slackbot font partie des exemples), et que l'option htmlLimitedBots permet d'adapter la liste. Si un robot qui compte pour vous n'y figure pas, ajoutez-le. Sur le Pages Router, l'équivalent est le composant Head de next/head, avec un attribut key pour éviter les balises en double.
Ce sont deux fichiers spéciaux du dossier app. Un fichier sitemap.ts qui exporte une fonction renvoyant des URL devient /sitemap.xml ; un fichier robots.ts devient /robots.txt. La référence sur le sitemap indique que le fichier est mis en cache par défaut et que la limite de Google est de 50'000 URL par sitemap ; au-delà, generateSitemaps le découpe en plusieurs fichiers.
import type { MetadataRoute } from 'next'
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const posts = await getPosts()
return posts.map((p) => ({
url: `https://example.com/blog/${p.slug}`,
lastModified: p.updatedAt,
}))
}N'y mettez que des URL canoniques, indexables et qui répondent 200, avec la vraie date de mise à jour dans lastModified. Le sitemap accepte aussi alternates.languages pour les sites multilingues. Dans robots.ts, indiquez l'adresse du sitemap et décidez quels robots d'IA peuvent explorer le site ; notre article sur le robots.txt pour les robots des IA les recense. Le format est détaillé dans notre fiche sur le sitemap XML.
| Problème | Conséquence | Correction |
|---|---|---|
| Navigation par onClick et router.push | Google ne suit que les éléments a dotés d'un href | Utiliser le composant Link de next/link, qui produit un vrai lien |
| Contenu introuvable servi en page 200 | « Soft 404 » dans Search Console | Appeler notFound() pour que la route renvoie un statut 404 |
| Redirections temporaires pour des pages déplacées | redirect() envoie un 307 | Utiliser permanentRedirect() ou permanent: true dans next.config (308) |
| Barres obliques finales mélangées | Deux URL pour la même page | En choisir une avec l'option trailingSlash et garder des canoniques cohérentes |
| Déploiements de préproduction indexés | Copies du site en double dans Google | Envoyer noindex sur les domaines hors production |
| Contenu d'onglets chargé au clic | Texte absent du HTML | Rendre tout le contenu sur le serveur, quitte à le masquer en CSS |
Tous ces défauts réduisent l'explorabilité : un robot doit pouvoir découvrir chaque URL par des liens et obtenir un code de statut propre.
La documentation Next.js recommande de rendre le JSON-LD dans une balise script de type application/ld+json directement dans le composant de page ou de layout, à partir des mêmes données que la page, en échappant le caractère < dans le JSON sérialisé pour éviter toute injection. Comme il est rendu sur le serveur, Google et les robots des IA le voient dans le HTML brut. Utilisez Article (ou BlogPosting) pour les articles, Organization dans le layout racine, BreadcrumbList pour les pages profondes et Product en e-commerce. Un générateur de schema vous donne un bloc valide de départ, puis validez la page avec le test des résultats enrichis de Google.
Next.js fournit les composants qui traitent les causes habituelles de mauvais Core Web Vitals :
Mesurez les données de terrain, pas seulement un score de laboratoire : notre guide de PageSpeed Insights montre comment lire les deux.
Un blog Next.js prend en général l'une de ces trois formes : des fichiers MDX ou Markdown dans le dépôt (simple, mais chaque article demande un commit et un déploiement), un CMS headless (Sanity, Contentful, Strapi, Payload) interrogé dans des Server Components, ou un webhook de publication qui reçoit les articles d'un outil externe. Dans les trois cas, le schéma SEO est le même : une route dynamique app/blog/[slug] avec generateStaticParams, generateMetadata, l'ISR, un sitemap alimenté par la même source et une page d'index qui relie tous les articles.
Le webhook sort la publication du cycle de déploiement. Un Route Handler reçoit l'article, l'enregistre, puis revalide les pages concernées :
// app/api/publish/route.ts
import { revalidatePath } from 'next/cache'
export async function POST(request) {
if (request.headers.get('authorization') !== `Bearer ${process.env.PUBLISH_SECRET}`) {
return new Response('Unauthorized', { status: 401 })
}
const article = await request.json()
await savePost(article)
revalidatePath('/blog')
revalidatePath(`/blog/${article.slug}`)
return Response.json({ ok: true })
}Attention
Protégez le point d'entrée par un secret et revalidez le chemin public exact. La documentation sur l'ISR prévient qu'avec plusieurs instances de serveur et le cache fichier par défaut, la revalidation à la demande ne vide que l'instance qui reçoit l'appel ; utilisez un gestionnaire de cache partagé.
Le rendu serveur est la première condition du GEO (optimisation pour les moteurs génératifs). L'analyse de Vercel de décembre 2024, The rise of the AI crawler, conclut qu'« aucun des grands robots d'IA n'exécute actuellement JavaScript », en citant GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot et PerplexityBot, et compte 569 millions de requêtes de GPTBot et 370 millions de Claude sur son réseau en un mois. Une page Next.js qui prérend son texte, ses titres et son JSON-LD est lisible par tous ; une page rendue côté client ne l'est pas.
La seconde condition, c'est un contenu digne d'être cité : des articles qui répondent à une question par section, avec sources, chiffres et définitions nettes, publiés régulièrement. C'est la partie qu'automatise Sorank, notre produit. Sorank est un logiciel SEO et GEO en autopilote : il trouve vos mots-clés, et son générateur d'articles de blog rédige 20, 60 ou 120 articles par mois avec sources, liens internes et images. Sur un site Next.js, il se connecte par le webhook personnalisé décrit sur la page d'installation : votre Route Handler reçoit chaque article, l'enregistre et revalide le blog. Le suivi des mentions dans les IA vérifie ensuite chaque semaine si ChatGPT, Claude et Gemini citent votre marque.

En résumé : prérendez chaque page que vous voulez voir trouvée, définissez les métadonnées sur le serveur et alimentez le sitemap depuis la même source que le contenu. Next.js fournit les outils ; les positions et les citations par les IA viennent de ce que vous publiez avec. Pour alimenter un blog Next.js en articles, consultez les offres Sorank, à partir de 49€ par mois avec 3 jours offerts.
Next.js est construit sur React : la comparaison porte donc sur le mode de rendu. Une application React monopage par défaut se construit dans le navigateur et envoie un HTML presque vide, alors que Next.js prérend les pages sur le serveur ou au build. Les robots, y compris ceux des IA qui n'exécutent pas JavaScript, reçoivent un contenu complet avec Next.js sans réglage supplémentaire.
Pas tout seul. Dans l'App Router, vous ajoutez au dossier app un fichier sitemap.ts qui renvoie vos URL, et Next.js le sert à l'adresse /sitemap.xml. Pour les gros sites, generateSitemaps répartit la liste en plusieurs fichiers, car Google accepte jusqu'à 50'000 URL par sitemap.
Les deux peuvent bien se positionner, car les deux prérendent le HTML. L'App Router est le choix recommandé pour un nouveau projet : les Server Components réduisent le JavaScript côté client, et la Metadata API, sitemap.ts et robots.ts gèrent nativement les fichiers SEO. Sur un site existant en Pages Router, migrer vaut rarement la peine pour le seul SEO.
ILS ONT ESSAYÉ SORANK AVANT VOUS
