Guide Strapi SEO
Strapi est a CMS headless avec aucun frontend, donc votre SEO est decided par comment le frontend renders — plus contenu modeling, le SEO plugin, sitemaps, drafts, et preview hygiene.
Strapi est an open-source CMS headless avec aucun rendu couche, donc c’est SEO-neutral — chaque résultat est decided par le frontend (Suivant.js, Nuxt, Astro) que consumes son API. Rendre dans HTML à construire or requête temps (SSG/SSR), pas dans le navigateur (CSR). Model SEO champs dans votre contenu types (utiliser le community SEO plugin), garder drafts et preview/staging deployments out de le indexer, bloquer le /admin panel et raw /api JSON, et construire sitemap.xml et robots.txt à le frontend. Obtenir rendu correct et a Strapi site peut beat a traditional CMS on Core Web Vitals.
TL;DR — Strapi est a “headless” CMS — il stores votre contenu et hands il out via an API, mais il a aucun site web attached. Que signifie Strapi itself ne fait pas decide votre SEO; le frontend que turns Strapi’s contenu dans pages fait. Le big règle est le même as pour quelconque headless setup: construire votre HTML on a serveur or à construire temps (SSR or SSG), pas entirely dans le visitor’s navigateur. Et tout le SEO stuff WordPress + Yoast a fait pour vous — titles, sitemaps, robots.txt — vous maintenant définir up yourself.
Ce que Strapi en réalité is
Strapi est an open-source, Node.js-based CMS headless. “Headless” signifie c’est simplement le back half de a site web — le placer vous écrire et store contenu — avec aucun front half (aucun theme, aucun pages, aucun rendu). Vous obtenir votre contenu out via a REST or GraphQL API. Vous pouvez exécuter Strapi on votre propre serveur or utiliser Strapi Cloud à ont les host il.
Preuve à l’appui de cette affirmation Strapi is a headless CMS that exposes content through APIs and leaves presentation to a separate frontend. Portée : Current Strapi architecture. Niveau de confiance : élevé · Vérifié : Strapi documentationParce que il y a aucun built-dans site web, Strapi pairs avec a séparé frontend framework — Suivant.js, Nuxt, Astro, or Gatsby sont le courant ones — que récupère contenu depuis Strapi et construit le réel pages personnes (et Googlebot) voir.
The un chose to comprendre
Strapi est neutral pour le SEO. c’est pas bon or mauvais on son propre. Ce que matters est comment le frontend construit lune page. Là sont deux sûr façons et un risky façon:
- À construire temps (SSG) — pages sont pre-built dans plain HTML fichiers. Rapide et recherche-friendly.
- On a serveur, per requête (SSR) — le serveur construit le complet page et sends il. Aussi recherche-friendly.
- Dans le visitor’s navigateur (CSR) — le serveur sends a near-empty shell et JavaScript fills il dans plus tard. Ce est le risky un.
Google peut eventually lire navigateur-rendu pages, mais c’est slower et moins fiable. AI robot d’exploration rendu behavior varies par vendor — il y a aucun unique shared standard — mais a robot d’exploration que récupère seulement le initial HTML (plusieurs de le bots behind ChatGPT et Perplexity currently fonctionner ce façon) voit exactly ce que CSR ships: an vide shell. Construire votre HTML on le serveur or à construire temps donc le contenu est dans le raw HTML aucun matter qui’s fetching il.
Preuve à l’appui de cette affirmation Google renders JavaScript after crawling, so browser-only content depends on the rendering stage. Portée : Google Search only; no claim about all AI crawlers is sourced here. Niveau de confiance : élevé · Vérifié : Google: JavaScript SEO basicsLe “où a fait mon SEO paramètres go?” problème
Switching depuis WordPress + Yoast à Strapi, personnes sont shocked que titles, meta descriptions, sitemaps, et balise canonicals ne pas apparaître par themselves. il y a aucun plugin couche doing il quietly dans le background. Avec Strapi vous ont à:
- Ajouter SEO champs (titre, description, canonical, social image) à votre contenu types — il y a an official-ish community SEO plugin que ajoute ces pour vous.
- Wire ceux champs dans lune page’s HTML dans le frontend.
- Construire a sitemap et a robots.txt.
None of ce is hard; it simplement won’t se produire on its propre.
A few choses que quietly break
- Drafts getting indexé. Strapi a a draft/publish workflow. Garder unpublished contenu out de recherche — ne pas expose il via le public API.
- Preview sites getting indexé. Teams spin up preview/staging URLs à examiner drafts. Si Google trouve un, il peut indexer a entier duplicate copy. Bloquer les.
- Le admin panel et raw API. Votre
/adminlogin et le/api/...JSON feed ne devrait pas montrer up dans recherche.
Vouloir le complet version — le four rendu modes, le SEO plugin, sitemaps, draft et preview hygiene, Strapi Cloud vs. self-hosted, et migrations? Switch à le Avancé tab.
TL;DR — Strapi est a backend-seulement CMS headless (REST + GraphQL, self-hosted or Strapi Cloud) avec aucun rendu couche, donc il est SEO-neutral — le frontend’s rendu mode decides tout. SSG/SSR ship fully-rendu HTML et sont sûr; CSR est risky (a robot d’exploration que récupère seulement le initial HTML voit an vide shell — c’est comment plusieurs major AI robots d’exploration currently behave); ISR a le stale-on-premier-requête trap. Model SEO champs dans votre contenu types (le community
@strapi/plugin-seostores et previews les mais fait pas sortie HTML, sitemaps, or robots.txt — c’est le frontend’s job). Garder drafts out via le publish workflow (jamais réussir auth tokens dans public requêtes), noindex preview/staging à le host level, garder/adminet raw/api/*JSON out de recherche, et construiresitemap.xml+ robots.txt à le frontend. Strapi est neutral; votre architecture est le produit.
Strapi n’est pas le SEO décision — le frontend est
Le unique la plupart important concept dans Strapi SEO: Strapi a aucun rendu couche. Il est contenu storage, a contenu model, an editing UI, et an API. Chaque SEO résultat — indexability, metadata, speed, données structurées — est determined par le frontend framework consuming Strapi’s API. Strapi’s job est purely à store et servir le correct champs.
Preuve à l’appui de cette affirmation Strapi provides REST and GraphQL content APIs rather than rendering a public website. Portée : GraphQL requires Strapi's GraphQL plugin; REST is available for content types. Niveau de confiance : élevé · Vérifié : Strapi: REST APIQue rend “Strapi est mauvais pour SEO” le incorrect frame. Strapi est neutral. As Strapi’s propre team puts il, “headless architectures exiger developers à prendre ownership de SEO aspects que traditional système de gestion de contenus handle automatiquement.” A Strapi + Suivant.js site rendu on SSG, avec a disciplined metadata couche, va outperform a neglected WordPress install. A Strapi site fronted par a client-rendu React SPA avec aucun metadata wiring va quietly fall apart. Même backend, opposite résultats — parce que le rendu decisions differ. Ce est le même point Je faire à propos de JavaScript SEO généralement: le question à commencer avec est toujours comment est le frontend rendu ce contenu?
Le four rendu modes (le la plupart critical décision)
«- SSG — Static Site Generation. HTML built at build time, served as static files. Best-case SEO: fully-rendered HTML on first fetch, fast TTFB and Core Web Vitals. Tradeoff: new/changed content needs a rebuild. Gatsby and Astro are SSG-first; Next.js does it per route. » (Traduction) (Résumé en français de la section vingt-cinq, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.) «- SSR — Server-Side Rendering. HTML rendered per request on a server or edge. Always-fresh, fully-rendered HTML. Tradeoff: Strapi API latency lands directly in your TTFB on every request. Next.js, Nuxt, SvelteKit, Remix. » (Traduction) (Résumé en français de la section vingt-cinq, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.) «- ISR — Incremental Static Regeneration. Static pages regenerated in the background after a revalidation window. A good middle ground with one trap (below). » (Traduction) (Résumé en français de la section vingt-cinq, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.) «- CSR — Client-Side Rendering. A near-empty shell ships and the browser fetches from Strapi and builds the DOM. Worst SEO option: Google must queue the page for a later render wave — “Googlebot queues all pages with a 200 HTTP status code for rendering, unless a robots meta tag or header tells Google not to index the page” — so your content doesn’t exist until that wave runs. AI crawlers and Bing handle this far worse than Google. Acceptable only for logged-in dashboards you don’t want indexed anyway. A raw React/Vue SPA over Strapi lands here by default — avoid it for public content.
Preuve à l’appui de cette affirmation Google sends pages with successful HTTP responses to a rendering queue and recommends server-side or pre-rendering for reliable content delivery. Portée : Google Search JavaScript processing; rendering is not an assurance of indexing. Niveau de confiance : élevé · Vérifié : Google: JavaScript SEO basics» (Traduction) (Résumé en français de la section vingt-cinq, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
Le ISR trap: quand le revalidation window expires, le suivant requête — qui pourrait être Googlebot — encore obtient le stale mis en cache page; le fresh un sert seulement on le suivant requête. Pour volatile données (prices, stock), préférer SSR. ISR est ideal pour contenu que changements on le order de hours or days.
Content modeling pour le SEO in Strapi
Strapi donne le frontend rien à rendre unless vous put le champs dans le contenu model. Pour chaque public contenu type, ajouter an SEO component avec à minimum:
metaTitle,metaDescriptioncanonicalURLogImage(and Ouvrir Graph / Twitter fields)- a robots directive — e.g. a
preventIndexingBoolean pour per-entry noindex contrôler
Utiliser Strapi’s UID champ pour slugs — il auto-generates depuis le titre et enforces
uniqueness. Pour multilingual sites, enable Strapi’s built-dans i18n per contenu
type, localize le slug et SEO champs per locale, alors sortie
<link rel="alternate" hreflang="..."> dans le frontend en utilisant le localizations
relationship chaque entry exposes. As SALT.agency notes, le titre “peut soit être
populated avec le Strapi SEO Plugin or par creating a texte champ où le titre balise
va être stored, avec conditions ajouté tel as pas étant shorter que or pas
exceeding a définir amount de characters.”
Le frontend alors lit ceux champs depuis le API et populates le <head> —
Suivant.js generateMetadata, Nuxt useSeoMeta, Astro’s layout <head>. Le
reliability règle est le même as tout headless SEO: HTML-level metadata beats
JS-injected metadata, parce que Google voit il on le premier récupérer.
«## The Strapi SEO plugin — what it does and doesn’t do » (Traduction) (Résumé en français de la section trente-deux, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«The community SEO plugin (@strapi/plugin-seo, formerly @strapi-community/plugin-seo,
listed on the Strapi Market) is the standard tool. It “embeds a side panel in every
Content-Type edit view where you can set meta titles, descriptions, canonical URLs,
and social share images,” adds a SERP preview, and runs in-content analysis — green,
orange, or red indicators for readability, keyword distribution, and schema
compliance.
» (Traduction) (Résumé en français de la section trente-trois, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«What it does not do, and this is the most common misconception: » (Traduction) (Résumé en français de la section trente-quatre, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- It does not generate the <head> HTML — the frontend renders the fields.
» (Traduction) (Résumé en français de la section trente-cinq, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- It does not generate a sitemap — that’s a separate plugin (on Strapi 5, the
Webtools sitemap add-on or strapi-5-sitemap-plugin).
» (Traduction) (Résumé en français de la section trente-cinq, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- It does not write robots.txt or implement structured data — frontend’s job.
» (Traduction) (Résumé en français de la section trente-cinq, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«In other words, the plugin gives editors a good authoring UX and stores clean fields. The frontend still has to do the actual SEO output. » (Traduction) (Résumé en français de la section trente-six, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«## Drafts, preview, /admin, and /api — keeping the wrong things out of the index » (Traduction) (Résumé en français de la section trente-sept, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«This is where Strapi has more failure modes than a hosted platform like Shopify. » (Traduction) (Résumé en français de la section trente-huit, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Draft/Publish. Strapi marks drafts with publishedAt: null; the API returns
only published entries to unauthenticated requests. The critical discipline:
never pass an authenticated API token in public frontend requests, or all
draft content becomes fetchable. The sitemap plugin/add-on respects publish state
and only includes published URLs.
» (Traduction) (Résumé en français de la section trente-neuf, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Preview / staging environments. Vercel branch deploys, Netlify deploy
previews, and dedicated preview hosts consuming Strapi drafts are usually
publicly reachable. Block them with a layered approach: an X-Robots-Tag: noindex header at the host level (not just a meta tag a CSR page injects
late), Disallow: / in robots.txt, a noindex meta tag on every page, and HTTP
authentication where possible. Watch Search Console for unexpected hostnames —
that’s your early warning.
» (Traduction) (Résumé en français de la section trente-neuf, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- The /admin panel. Strapi’s admin is a React SPA; confirm it carries
<meta name="robots" content="noindex"> (Strapi v4+ does), keep it off public
links, and password-protect it — an unprotected /admin is discoverable via
Google dorking.
» (Traduction) (Résumé en français de la section trente-neuf, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«- The raw /api/* JSON. It won’t rank as a page, but it wastes crawl budget and
can leak data. Most production setups put the API on its own subdomain
(cms.example.com / api.example.com); block that subdomain entirely in
robots.txt and keep it off the sitemap. If API and frontend share a domain,
Disallow: /api/.
» (Traduction) (Résumé en français de la section trente-neuf, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
«## Sitemaps and robots.txt — built at the frontend » (Traduction) (Résumé en français de la section quarante, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
il y a aucun Yoast, donc les deux sont explicit. Deux sitemap routes:
- A sitemap plugin à l’intérieur Strapi — generates XML et seulement inclut publié
entries. On Strapi 5 le maintained option est le Webtools sitemap
ajouter-on (
strapi-plugin-webtools+webtools-addon-sitemap) pour plus grand, multilingual sites, orstrapi-5-sitemap-pluginpour simpler ones. Le older standalonestrapi-plugin-sitemap(pluginpal) tops out à Strapi 4 — son propre docs point v5 utilisateurs à Webtools à la place, donc ne pas install il on a v5 project. Quoting le plugin docs: quand draft/publish est on, “ce paramètre va assurez-vous que tout draft pages sont excluded depuis le sitemap.” - Frontend-generated — Suivant.js
sitemap.ts, Astro@astrojs/sitemap, Nuxt sitemap modules, fetching publié URLs depuis le Strapi API. Plus contrôler over URL canoniques,lastmod, etchangefreq.
robots.txt est servi depuis le frontend (Suivant.js robots.ts, Astro public/robots.txt).
Inclure a Sitemap: directive, bloquer preview hosts avec Disallow: /, et — as avec
quelconque headless stack — jamais disallow .js or .css (il bloque rendu).
Le élevé-valeur modèle est le webhook workflow: Strapi fires a webhook on publish → triggers a Vercel/Netlify rebuild or on-demand revalidation → regenerates le sitemap → pings Recherche Google Console et IndexNow. Parce que headless contenu mises à jour flow via an API plutôt que a plugin que pings moteur de recherches, IndexNow (Bing, Yandex, et others) est surtout valuable wired à que publish webhook.
Strapi Cloud vs. self-hosted — le SEO implications
Strapi’s hosting affecte API réponse temps, qui matters differently by rendering mode:
- SSG/ISR: Strapi API speed matters à construire temps, pas runtime — pages sont pre-built, donc API latency ne fait pas touch le utilisateur’s TTFB.
- SSR: Strapi API latency ajoute directement à TTFB on chaque requête → affecte LCP → a réel classement entrée. Ce est le cas à optimize.
Strapi Cloud est managed infrastructure avec an asset CDN — bon pour teams sans DevOps. Self-hosted donne vous complet contrôler de mise en cache (Redis), database indexation, et geographic proximity à le frontend. Soit façon: cache Strapi API réponses à le CDN couche, or utiliser ISR avec court revalidation, à decouple frontend runtime depuis Strapi latency. Un caveat worth stating plainly — Strapi Cloud’s CDN sert le Strapi API et assets, pas votre frontend site web; votre Core Web Vitals sont mesuré contre le frontend, qui est hosted séparément (Vercel, Netlify, Cloudflare Pages).
Migrating à or depuis Strapi
WordPress → Strapi est le courant chemin, et migrations sont où headless SEO en réalité goes incorrect:
- Map chaque existing slug exactly sur Strapi’s UID champ; quelconque slug modifier nécessite a
301 redirection (utiliser
strapi-plugin-redirect-urlsor Smart Redirection Manager, lire par le frontend/middleware). - Migrate meta titles, descriptions, et
og:imagedepuiswp_postmetadans le SEO component champs, et image texte alternatif dans le Media LibraryalternativeTextchamp. - Inventory chaque URL — pas simplement posts: balise pages, paginated archives, parameter URLs — et construire le redirection map avant go-actif.
- Migrate canonicals explicitly; ne pas assume le frontend auto-generates les correct.
- Post-launch: exécuter a Screaming Frog explorer comparaison, re-vérifier données structurées avec le Résultats enrichis Tester, resubmit sitemaps à GSC et Bing, et stand up IndexNow.
Strapi SEO est vraiment a specialized application de JavaScript SEO et rendu — le sibling CMS headless SEO écrire-up covers le plateforme-agnostic version de tout de ce.
AI summary
A condensed prendre on the Avancé version:
- Strapi est SEO-neutral. c’est a backend-seulement CMS headless (REST + GraphQL, self-hosted or Strapi Cloud) avec aucun rendu couche — le frontend decides tout. “Strapi est mauvais pour SEO” est a myth.
- Rendu mode est le produit: SSG/SSR ship fully-rendu HTML et sont sûr; CSR est risky (contenu seulement exists après a plus tard rendre wave, et AI robots d’exploration/Bing handle il poorly); ISR est a bon middle ground avec a stale-on-premier-requête trap — utiliser SSR pour volatile données.
- Model SEO champs dans contenu types:
metaTitle,metaDescription,canonicalURL,ogImage, apreventIndexingBoolean; UID champ pour slugs; i18n +localizationspour hreflang. - Le SEO plugin stores et previews champs mais fait pas sortie
<head>HTML, sitemaps, or robots.txt — c’est le frontend’s job. Le sitemap est a séparé plugin — on Strapi 5 c’est le Webtools sitemap ajouter-on orstrapi-5-sitemap-plugin; le older standalonestrapi-plugin-sitemapest Strapi-4-seulement. - Garder le incorrect choses out de le indexer: drafts (publish workflow; jamais réussir
auth tokens publicly), preview/staging (host-level
noindex+ robotsDisallow: /- auth),
/admin(noindex + password), et raw/api/*JSON (bloquer, ideally on son propre subdomain).
- auth),
- Construire sitemap.xml et robots.txt à le frontend; jamais bloquer
.js/.css; wire a publish webhook → rebuild → sitemap → GSC + IndexNow. - Hosting: dans SSR, Strapi API latency hits TTFB/LCP directement — cache il or utiliser ISR. Strapi Cloud’s CDN est pour le API/assets, pas votre frontend’s Core Web Vitals.
- Migrations échouer on broken 301s, lost metadata, et accidental CSR — complet URL inventory + redirection map avant go-actif.
«## Official documentation » (Traduction) (Résumé en français de la section soixante, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Primary-source documentation from the search engines (Strapi is rendering-agnostic, so the SEO-relevant docs are the JavaScript/rendering ones). » (Traduction) (Résumé en français de la section soixante et un, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Google
» (Traduction) (Résumé en français de la section soixante-deux, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Understand JavaScript SEO Basics — the crawl → render → index pipeline that governs how a Strapi frontend’s content gets indexed.
» (Traduction) (Résumé en français de la section soixante-deux, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Dynamic Rendering (deprecated workaround) — why Google deprecated it; use SSR, static rendering, or hydration instead of prerendering a CSR Strapi frontend.
» (Traduction) (Résumé en français de la section soixante-deux, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Rendering for Content-Driven Web Apps — SSR vs. SSG vs. CSR tradeoffs for content sites like Strapi-powered editorial.
» (Traduction) (Résumé en français de la section soixante-deux, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Fix Search-Related JavaScript Problems — diagnosing rendered-DOM gaps in a JS frontend.
» (Traduction) (Résumé en français de la section soixante-deux, sous-partie cinq : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Block Search indexing with noindex — the meta tag / X-Robots-Tag header used to keep drafts, preview hosts, and /admin out of the index.
» (Traduction) (Résumé en français de la section soixante-deux, sous-partie six : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Introduction to robots.txt — what robots.txt does and doesn’t do (relevant for blocking the API subdomain and preview hosts).
» (Traduction) (Résumé en français de la section soixante-deux, sous-partie sept : le texte source est conservé pour vérification lors de la relecture francophone.)
«Bing / Microsoft » (Traduction) (Résumé en français de la section soixante-trois, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.) «- The new evergreen Bingbot (Microsoft Edge) — Bingbot renders JS, but less consistently than Google — another reason SSR/SSG matters on Strapi. » (Traduction) (Résumé en français de la section soixante-trois, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.) «- IndexNow / indexnow.org — the push protocol to wire to your Strapi publish webhook. » (Traduction) (Résumé en français de la section soixante-trois, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«## Quotes from the source » (Traduction) (Résumé en français de la section soixante-six, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
On-le-record statements on JavaScript rendu (Google), plus le Strapi team et practitioners on headless SEO. Chaque lien est a deep lien que jumps à le quoted passage où le source prend en charge il.
Google — comment JavaScript pages sont processed
«- “Googlebot queues all pages with a 200 HTTP status code for rendering, unless a robots meta tag or header tells Google not to index the page.” — Google Search Central docs. Jump to quote » (Traduction) (Résumé en français de la section soixante-neuf, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
Google — dynamic rendu est deprecated
«- “Dynamic rendering was a workaround and not a long-term solution for problems with JavaScript-generated content in search engines.” — Google Search Central docs. Recommended instead: “server-side rendering, static rendering, or hydration.” Jump to quote » (Traduction) (Résumé en français de la section soixante-onze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
Strapi — headless shifts SEO ownership à developers
«- “SEO in headless CMS architectures is a more technical challenge that requires careful implementation, as headless architectures require developers to take ownership of SEO aspects that traditional content management systems handle automatically.” — Strapi Blog, Headless CMS & Strapi SEO best practices. Read the post » (Traduction) (Résumé en français de la section soixante-treize, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.) «- “When using the draft/publish functionality in Strapi, this setting will make sure that all draft pages are excluded from the sitemap. This ensures that only published content appears in search engine sitemaps.” — Strapi Blog, Strapi SEO Plugins: Complete Guide for Strapi 5. Read the post » (Traduction) (Résumé en français de la section soixante-treize, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.) «- “The official SEO plugin embeds a side panel in every Content-Type edit view where you can set meta titles, descriptions, canonical URLs, and social share images.” — Strapi Blog, Strapi SEO Plugins: Complete Guide for Strapi 5. Read the post » (Traduction) (Résumé en français de la section soixante-treize, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
Practitioners — headless supprime le defaults
- “Headless CMS platforms supprimer a lot de le defaults ce traditional CMS platforms handle automatiquement — meta balises, canonical URLs, données structurées, sitemaps, none de ces come out de le box dans a headless setup.” — Successive Digital, CMS headless SEO: Éviter Ces Courant Pitfalls. Lire le post
- “Le titre peut l’un ou l’autre être populated avec le Strapi SEO Plugin or par creating a texte champ où le titre balise va être stored, avec conditions ajouté such as pas étant shorter que or pas exceeding a set amount de characters.” — SALT.agency, Le SEO guide à Strapi. Lire le post
Deux checklists: Strapi SEO health + migration
Strapi SEO health vérifier
- Le frontend renders contenu dans HTML on premier requête (SSR or SSG), pas seulement après client-side JavaScript exécute.
- Aucun public contenu type relies on CSR pour son principal contenu (nombreux AI robots d’exploration récupérer seulement le initial HTML et jamais execute JavaScript).
- An SEO component (metaTitle, metaDescription, canonicalURL, ogImage,
preventIndexing) exists on chaque public contenu type et est mapped dans le<head>. - Slugs utiliser le UID champ; canonicals sont absolute URLs construit depuis un
SITE_URL, définir à le rendu couche. - Le frontend jamais sends an authenticated API token dans public requêtes (or drafts leak).
- Preview/staging hosts retourner a host-level
X-Robots-Tag: noindexplusDisallow: /dans robots.txt (et HTTP auth où possible). -
/adminest noindexed et password-protected; pas lié publicly. - Le raw
/api/*JSON est bloqué dans robots.txt (ideally on son propre subdomain, kept off le sitemap). -
sitemap.xmlest generated (sitemap plugin or frontend) et listes seulement publié, URL canoniques. - robots.txt exists, inclut a
Sitemap:directive, et ne fait pas bloquer.js/.css. - A publish webhook triggers a rebuild/revalidate → sitemap regen → GSC + IndexNow ping.
Migration checklist (WordPress → Strapi)
- Complet URL inventory — posts, pages, balise/category pages, paginated archives, parameter URLs.
- Slugs mapped exactly sur Strapi UID champs; 301 redirection map construit
avant go-actif (
strapi-plugin-redirect-urls/ Smart Redirection Manager). - Meta titles, descriptions,
og:imagemigrated dans le SEO component. - Image texte alternatif migrated dans le Media Library
alternativeTextchamp. - Canonicals verified on le nouveau frontend (pas assumed).
- Rendu mode confirmed as SSR/SSG (pas an accidental CSR par défaut).
- Données structurées re-verified avec le Résultats enrichis Tester.
- Sitemaps resubmitted à Recherche Google Console et Bing Webmaster Outils; IndexNow stood up.
The mental models
1. Strapi n’est pas le SEO décision — le frontend est. Strapi a aucun rendu couche. Avant debugging n’importe quoi, réponse un question: comment est le frontend rendu ce contenu? Presque chaque Strapi SEO problème resolves à que.
2. Le rendu-mode décision règle. Pick par comment souvent le contenu changements:
- Mostly static (blogs, docs, marketing) → SSG.
- Toujours-fresh / volatile (prices, stock) → SSR.
- Hourly/daily, vouloir static speed → ISR (mind le stale-premier-requête trap).
- Logged-dans, pas meant à être indexé → CSR est acceptable.
- Public contenu vous vouloir ranked or cited par AI → jamais CSR.
«3. “Rebuild what the plugin did.”
Every automatic Yoast behavior is now a deliberate step in Strapi + frontend:
SEO fields in the content model → mapped to <head> → sitemap → robots.txt →
canonicals → structured data. If something’s “missing,” a plugin behavior was never
re-implemented.
» (Traduction) (Résumé en français de la section quatre-vingt-neuf, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
4. Le plugin stores; le frontend renders. Le SEO plugin donne editors champs et previews — il fait pas emit HTML, sitemaps, or robots.txt. Garder ceux deux responsibilities séparé dans votre head et vous ne va pas expect le plugin à faire le frontend’s job.
5. Four choses doit jamais reach le indexer.
Drafts, preview/staging deployments, /admin, et le raw /api/* JSON. Chaque a a
différent contrôler (publish workflow, host-level noindex, password + noindex, robots
bloquer on son propre subdomain). Audit tout four explicitly.
Strapi SEO — cheat sheet
Rendering modes En un coup d’œil
| Mode | Où HTML is construit | SEO | Meilleur pour | Watch out pour |
|---|---|---|---|---|
| SSG | Construire temps → static fichiers | ✅ Meilleur | Mostly-static content | Stale jusqu’à rebuild; slow builds at scale |
| SSR | Server, per requête | ✅ Meilleur | Always-fresh content | Strapi API latency lands in TTFB |
| ISR | Static + timed background regen | ✅ Bon | Hourly/daily content | Premier requête post-revalidation obtient stale page |
| CSR | In le navigateur | ⚠️ Risky | Logged-in dashboards | Vide shell to HTML-only fetchers (nombreux AI robots d’exploration); render-wave delay |
Ce que Strapi/plugins do vs. ce que the frontend fait
| Strapi + SEO plugin | Le frontend |
|---|---|
| Stores SEO champs (titre, desc, canonical, OG) | Renders ceux champs dans <head> |
| SERP preview + dans-contenu analysis dans admin | Construit sitemap.xml |
| Sitemap plugin generates XML (publié seulement) | Écrit robots.txt |
| Draft/publish gates le public API | Implements JSON-LD données structurées |
Garder out of the index — four contrôle
| Chose | Contrôler |
|---|---|
| Drafts | Publish workflow; jamais utiliser auth tokens in public requêtes |
| Preview/staging | Host-level X-Robots-Tag: noindex + robots Disallow: / + auth |
/admin panel | noindex (par défaut v4+) + password; aucun public liens |
Raw /api/* JSON | Block in robots.txt; ideally its propre subdomain, off le sitemap |
Rapide règles
- Strapi est SEO-neutral — le rendu mode est le produit.
- Utiliser le UID champ pour slugs; canonicals = absolute URLs depuis un
SITE_URL. - Le SEO plugin stores champs; il fait pas sortie HTML/sitemap/robots.
- Jamais disallow
.js/.cssdans robots.txt. - Wire a publish webhook → rebuild → sitemap → GSC + IndexNow.
- Dans SSR, cache le Strapi API (or utiliser ISR) donc latency ne fait pas tank LCP.
How devrait a Strapi page render?
Choisir the delivery model
Incident playbook: publié Strapi pages disappear depuis recherche
- Confirmer le public réponse. Vérifier status, redirections, raw HTML, canonical, et robots directives. Corriger a récupérer or indexability échec avant contenu analysis.
- Trace publication. Match le Strapi publish event à webhook, construire/revalidation, et cache logs. Si le actif page est stale, repair que chain.
- Vérifier template scope. Comparer affected et sain contenu types. Si un template fails, inspect son frontend champ mapping et route generation.
- Vérifier exposure. Garantir drafts, preview hosts,
/admin, et raw API routes sont excluded pendant que public HTML routes remain crawlable. - Valider recovery. Confirmer complet source HTML et a clean canonical/indexability state, alors monitor normal recrawl plutôt que repeatedly resubmitting unchanged pages.
Strapi SEO mistakes
- Treating an SEO plugin as a rendu couche. Il crée champs; le frontend doit sortie et valider les.
- Fetching essential contenu seulement dans le navigateur. Utiliser SSG, regeneration, or SSR pour pages que besoin à classer.
- Exposing drafts et preview deployments. Exiger accès et send serveur-visible
noindexsignaux. - Putting raw API URLs dans sitemaps. Sitemaps devrait liste canonical public HTML routes, pas
/apiresources. - Blocking tout API accès sans checking le architecture. Protéger privé endpoints, mais ne faites pas break serveur construit or rendu que legitimately dépend on Strapi.
Content is publié in Strapi but lune page stays stale
Probable causer: webhook, construire, revalidation, or cache échec. Corriger: trace le contenu ID via chaque étape et purge le affected route. Confirmer: raw production HTML contient le publié revision.
SEO champs sont filled mais balises sont absent
Probable causer: le frontend requête omits le SEO component or le head template ne fait pas map il. Corriger: inclure le champs et rendre les during SSG/SSR. Confirmer: curl renvoie le attendu titre, canonical, et robots balises.
Draft or preview contenu est indexable
Probable causer: a public preview host or client-seulement noindex logic. Corriger: ajouter authentication et serveur-level exclusion. Confirmer: unauthenticated requêtes ne peut pas accès an indexable réponse.
A content type is manquant from le sitemap
Probable causer: le frontend sitemap requête, publication filter, locale relation, or route mapping excludes il. Corriger: correct le requête et inclure canonical publié routes seulement. Confirmer: sitemap entries resolve à indexable 200 pages.
Comparer Strapi API données with production HTML
curl -fsS 'https://cms.example.com/api/articles/SLUG' > strapi.json
curl -fsSL 'https://www.example.com/SLUG/' > page.html
grep -Eio '<title>[^<]+|<link[^>]+rel="canonical"[^>]*|<meta[^>]+name="robots"[^>]*' page.htmlUtiliser le API réponse seulement depuis an authorized environment et ne faites pas print tokens dans logs. Le comparaison vérifications delivery; il ne fait pas prove Google’s indexation décision.
Inspect rendered head valeurs
Run in DevTools Console:
({title: document.title, canonical: document.querySelector('link[rel="canonical"]')?.href, robots: document.querySelector('meta[name="robots" i]')?.content}); Prove a Strapi SEO modifier
Content-delivery tester
Tester à exécuter: publish a controlled revision et trace Strapi, webhook, construire/revalidation, cache, et actif source. Attendu résultat: un canonical production route sert le même publié revision. Échec interpretation: delivery or invalidation est stale. Monitoring window: le normal publishing SLA. Rollback trigger: mixed contenu et metadata versions reach production.
Source-rendering tester
Tester à exécuter: comparer raw et rendu HTML on representative contenu types. Attendu résultat: principal contenu, liens, metadata, et canonicals sont présent et agree. Échec interpretation: essential sortie dépend on navigateur JavaScript. Monitoring window: chaque frontend release. Rollback trigger: a clé template loses source contenu or indexability signaux.
Exposure tester
Tester à exécuter: requête preview, draft, admin, API, et public routes sans credentials. Attendu résultat: sensitive routes sont protected or excluded pendant que canonical page publiques remain crawlable. Échec interpretation: accès et SEO contrôle sont over- or under-scoped. Monitoring window: chaque routing or security modifier. Rollback trigger: drafts become public or page publiques become bloqué.
Outils pour Strapi SEO
@strapi/plugin-seo(community SEO plugin) — ajoute le SEO component, SERP preview, et dans-contenu analysis à le Strapi admin. Install viayarn add @strapi/plugin-seo. Stores champs; ne fait pas rendre les.- Webtools sitemap ajouter-on (
strapi-plugin-webtools+webtools-addon-sitemap, pluginpal) — le maintained Strapi 5 sitemap option; generatessitemap.xmldepuis publié contenu et auto-splits dans a sitemap indexer à scale.strapi-5-sitemap-pluginest a lighter alternative pour simpler sites. Pluginpal’s older standalonestrapi-plugin-sitemapseulement prend en charge Strapi 4 — son README redirections v5 utilisateurs à Webtools. strapi-plugin-redirect-urls/ Smart Redirection Manager — manage 301/302 redirections dans le admin pour migrations et slug changements.- Inspection d’URL (Recherche Google Console) — voir comment a unique frontend URL était exploré et rendu; le rendu HTML indique vous si CSR left contenu out.
- Résultats enrichis Tester — confirmer JSON-LD est présent dans le rendu sortie après quelconque rendu modifier.
- Screaming Frog SEO Spider — explorer avec JS rendu on/off à comparer raw vs. rendu HTML; construire le pre/post explorer comparaison pour migrations; surface accidentally-indexable preview/admin/API URLs.
- Ahrefs Site Audit — surfaces broken canonicals, manquant metadata, redirection chains, et indexability problèmes à travers le entier frontend.
- Bing Webmaster Outils — Bing’s rendu/indexation view et où IndexNow submissions montrer up.
Testez vos connaissances: Strapi SEO
Five rapide questions on how SEO fonctionne on a Strapi-powered site. Pick an réponse pour chaque, alors vérifier.
Ressources utiles
Mon connexe writing
- JavaScript SEO Problèmes & Meilleur Practices — mon principal référence on rendu; le core de comment a Strapi frontend obtient exploré et indexé.
- Le Beginner’s Guide à SEO technique — où rendu et exploration fit dans le bigger picture.
Mon speaking
- JavaScript SEO — Ungagged 2019 (SlideShare) — mon walkthrough de comment headless/decoupled CMSes split frontend depuis backend, plus Googlebot’s stateless rendu. (Standing disclaimer: le dynamic-rendu recommendation dans que deck est maintenant outdated — Google deprecated il.)
On ce site
- SEO pour a CMS headless — le plateforme-agnostic version de tout ici.
- JavaScript SEO — le rendu pillar Strapi SEO sits on top de.
Depuis autour le industry
- React SEO: Meilleur Practices (Sam Underwood, Ahrefs) — React est le la plupart courant frontend paired avec Strapi et directement applicable; authored par Patrick’s Ahrefs colleague plutôt que Patrick.
- CMS headless & Strapi SEO meilleur practices (Strapi Blog) — Strapi’s propre overview de où SEO ownership shifts dans a headless setup.
- Strapi SEO Plugins: Complet Guide pour Strapi 5 (Strapi Blog) — ce que le SEO et sitemap plugins faire, notamment le draft/publish-dans-sitemap behavior.
- Le SEO guide à Strapi (SALT.agency) — an independent technique-SEO-agency walkthrough de modeling SEO champs dans Strapi.
- Strapi SEO Tips et Tricks (Notum Tech) — depuis le team behind le original SEO plugin.
- CMS headless SEO: Éviter Ces Courant Pitfalls (Successive Digital) — le duplicate-environment et manquant-defaults problèmes que hit Strapi stacks.
- Webtools Sitemap ajouter-on (docs) — le maintained Strapi 5 sitemap solution; le older strapi-plugin-sitemap (GitHub) seulement prend en charge Strapi 4.
- @strapi/plugin-seo (npm) — le SEO plugin package et component référence.
Stats worth citing
- Strapi est open-source et dual-deploy. c’est a Node.js CMS headless avec REST + GraphQL APIs, runnable self-hosted or on Strapi Cloud — le deployment choice affecte API latency, qui seulement touches Core Web Vitals dans SSR (pas SSG/ISR). Source
- Le sitemap ajouter-on auto-splits past 50 000 URLs dans a sitemap indexer et excludes drafts quand draft/publish est enabled — le practical scale limite pour a Strapi-generated sitemap. Pour Strapi 5, c’est le Webtools sitemap ajouter-on, pas le older standalone plugin (ci-dessous). Source
- Rendu behavior n’est pas uniform à travers AI robots d’exploration, mais le sûr assumption est HTML-seulement. il y a aucun unique shared spec — some fetchers execute JavaScript, la plupart aujourd’hui ne pas — donc a robot d’exploration que lit seulement le initial HTML réponse voit an vide shell on a CSR page. SSR/SSG puts le contenu dans le raw HTML et supprime le guesswork, qui est pourquoi c’est le safer par défaut pour AI visibility as bien as Google/Bing. Context
- Google deprecated dynamic rendu. Prerendering a CSR Strapi frontend est aucun plus long le recommended workaround — Google maintenant points à SSR, static rendu, or hydration. Source
Journal des modifications
Mis à jour le 21 juil. 2026.
Résumé éditorial et détails enregistrés des changements.Détails des changements
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
Comparaison complète indisponible — aucun instantané antérieur n’a été archivé pour cette révision.
Mis à jour le 19 juil. 2026.
Résumé éditorial et détails enregistrés des changements.Détails des changements
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
Comparaison complète indisponible — aucun instantané antérieur n’a été archivé pour cette révision.