Chaque page émet un head complet, une description structurée d'elle-même, une
carte sociale et une entrée dans la sitemap. L'essentiel est écrit par [Nuxt
SEO](https://nuxtseo.com), que la couche installe comme un seul bundle ; le reste
est la partie qui dépend des versions et des traductions, et elle appartient à la
couche. Une valeur doit venir de vous.

## Par page

- **Meta** — le titre suivi du nom du site, la description, et le couple
  `og:`/`twitter:` qui en découle. `og:type` et `og:url` sont posés par page ;
  `og:locale` et ses alternatives viennent des langues que le site sert.
- **JSON-LD** — un graphe par page : un `WebSite` (et votre `Organization`, une
  fois définie) déclarés à l'échelle du site, plus un `TechArticle` et une
  `BreadcrumbList` construite à partir du fil que dessine le fil d'Ariane.
- **Une image Open Graph**, rendue depuis le gabarit propre à la couche — sur la
  page d'accueil aussi. Fournissez un composant du même nom pour la remplacer.
- **`canonical` et `robots`**, qui forment la moitié versionnée — voir
  [URL et versions](/concepts/urls-and-versions). Le canonique d'une ancienne
  version pointe vers la version courante ; c'est pourquoi la couche l'écrit
  elle-même au lieu de laisser celui du module.
- **Une alternative Markdown et son index** — `rel="alternate"
  type="text/markdown"` pointe vers cette page suivie de `.md`, et
  `rel="describedby"` vers `/llms.txt`. À la différence du canonique,
  l'alternative nomme la page en cours de rendu, si bien qu'une ancienne version
  livre sa propre source — voir [Lecteurs machines](/concepts/machine-readers).

La page d'erreur porte `noindex, follow` : une 404 indexée concurrence la page
que le lecteur cherchait, et les suggestions qu'elle propose sont de vraies pages
qu'un robot doit encore pouvoir atteindre.

## À l’échelle du site

`/sitemap.xml` liste les pages de la version par défaut, par langue. Une version
qui n'est pas celle par défaut en est exclue puisque ses pages portent de toute
façon `noindex`, et une version `eol` en est exclue qu'elle soit la version par
défaut ou non : lister l'une ou l'autre revient à demander à un robot d'aller
chercher exactement ce que la page lui dira ensuite d'écarter. `/robots.txt` est
généré à côté.

`duxt.organization` est ce qui nomme l'éditeur — voir
[Configuration](/reference/configuration). Non défini, le site se décrit toujours
comme un `WebSite` ; ce qu'il perd, c'est l'entité derrière, celle que lit un
panneau de connaissances ou un résumé d'IA pour créditer une source.

## Ce qui est vérifié, et ce qui est seulement signalé

`pnpm check:seo` lit les pages construites et échoue sur un second `canonical`,
un `hreflang` absent, une page d'erreur indexable, un `og:locale` au mauvais
format, un graphe qui ne s'analyse pas, ou une page qui ne renvoie pas vers son
alternative Markdown et vers `/llms.txt`. Il tourne dans `pnpm check` après le
build, parce que ces balises n'existent que dans le HTML rendu.

Le vérificateur de liens signale au lieu d'échouer. Un lien qui ne mène nulle
part fait déjà échouer le build via les
[vérifications de build](/concepts/build-checks) propres à la couche, celles qui
comprennent les versions et les replis de langue ; l'apport du module ici, c'est
le panneau devtools et la vérification en direct pendant la rédaction.

## La seule valeur que vous devez indiquer

L’origine. `hreflang`, `canonical`, le sitemap et les images Open Graph sont
toutes des URL absolues, et une couche ne peut pas connaître le domaine sur
lequel elle sera déployée. Définissez `i18n.baseUrl` ou
`NUXT_PUBLIC_I18N_BASE_URL` ; la couche le copie vers `site.url`, où les modules
SEO vont le chercher.

Laissée vide, chacune retombe sur une sortie relative plutôt que d’inventer un
domaine. C’est le choix délibéré : un `canonical` relatif se résout toujours
correctement, alors qu’un `canonical` deviné est activement faux — il
dirigerait un robot vers le site de quelqu’un d’autre.

## Une variable de plus pour un déploiement progressif

`NUXT_OG_IMAGE_SECRET` signe les URL des images Open Graph. Sans elle, un secret
est généré par compilation, ce qui convient pour une instance et non pour deux :
une carte dont l’URL a été signée par une instance est rejetée par la suivante,
et un lien partagé pendant un déploiement progressif perd donc son image.
Générez-la une fois ; elle ne tourne pas.