Votre SPA n'apparaît pas dans l'index. Avant de tout migrer en SSR, confirmez le diagnostic. Dans 90 % des cas, Googlebot reçoit un <div id="root"></div> vide : votre contenu existe dans le DOM rendu côté client, pas dans le HTML brut servi à la requête initiale. Voici comment le vérifier sans deviner, puis détecter automatiquement quelles pages tombent en page blanche.
Le mécanisme exact de la page blanche
Googlebot crawle en deux temps. Googlebot explore vos URLs et lit le HTML brut, puis un moteur de rendu basé sur Chrome exécute le JavaScript pour reconstruire le DOM complet, et le contenu rendu est analysé puis éventuellement ajouté à l'index. Le problème : sur un site classique côté serveur, presque tout le contenu est disponible dès le HTML initial ; sur un site React, Vue ou Angular, c'est souvent l'inverse.
Deux conséquences mal comprises. D'abord, le rendu JS n'est pas garanti ni immédiat : pour du contenu sensible au temps, ne misez pas sur la file de rendu de Google. Ensuite, et c'est le point que la plupart des guides ignorent, Google peut utiliser des signaux provenant des deux versions, notamment en cas de contradiction entre la version HTML brut et le rendu HTML final. Un <title> générique dans le HTML brut et un <title> spécifique injecté en JS peut produire un mismatch que Google arbitre — rarement en votre faveur.
L'enjeu dépasse Google. GPTBot, ClaudeBot, PerplexityBot et les autres crawlers IA n'exécutent pas le JavaScript : ils parsent uniquement le HTML brut. Une SPA en page blanche pour Googlebot est totalement invisible pour les moteurs IA.
Étape 1 — Vérifier le HTML brut servi à la requête
Le test le plus rapide : curl sans exécution JS.
curl -sL https://votresite.com/une-page-cle | grep -i "<title>\|<h1\|votre contenu attendu"
Si vous obtenez un <title> générique d'app shell et aucun <h1> ni texte de contenu, vous avez votre réponse : le HTML brut est vide. C'est exactement ce que voient les crawlers IA et ce que Googlebot reçoit avant le rendu.
Confirmez visuellement en désactivant JavaScript dans Chrome DevTools (Cmd/Ctrl+Shift+P → "Disable JavaScript") puis rechargez. Page blanche = CSR pur sans fallback.
Étape 2 — Comparer HTML brut et HTML rendu
C'est l'étape que les guides « comment indexer ma SPA » sautent. Utilisez la vue « code source rendu » dans les crawlers SEO et comparez le HTML brut (sans JS) au HTML rendu pour détecter les éléments SEO manquants.
Concrètement, listez ligne par ligne :
<title>brut vs rendu<h1>brut vs rendu- balises canonical, meta description, hreflang
- liens internes (
<a href>) présents dans le brut
Un crawler comme Screaming Frog en mode rendu JS expose les deux versions côte à côte. Screaming Frog, OnCrawl et Sitebulb sont capables de rendre le JavaScript pour détecter les liens internes, les balises meta et les erreurs techniques. Tout élément présent uniquement dans le rendu est un risque d'indexation.
Étape 3 — Confronter à ce que Google capture réellement
L'outil d'inspection d'URL de la Search Console est la source de vérité. Cliquez sur « Afficher la page testée » pour afficher une capture d'écran de la page affichée, le code HTML brut renvoyé, les en-têtes HTTP, le résultat de la console JavaScript et les ressources chargées.
Deux signaux à lire absolument :
- La capture rendue. Page blanche ici = Googlebot n'a pas réussi à rendre votre contenu.
- La console JavaScript. Une erreur de script qui crash l'arbre de composants produit une indexation vide. Un script analytics tiers qui lève une erreur, ou une réponse API manquante qui crash l'arbre de composants, et Google indexe une page blanche. Ce cas est insidieux car il est intermittent : la page rend correctement la plupart du temps, puis échoue silencieusement sur le renderer de Google.
Vérifiez aussi vos ressources critiques. Les instructions du fichier robots.txt sont suivies par Googlebot pour tous les fichiers explorés ; si vous bloquez l'exploration de fichiers CSS ou JavaScript, ils ne figureront pas dans le rendu. Un bundle JS bloqué en robots.txt = page blanche garantie.
Étape 4 — Vérifier la découvrabilité des routes
Une SPA peut rendre correctement une URL et rester invisible faute de liens crawlables. Les SPA à routage client n'exposent pas leur structure d'URL via des liens HTML comme les sites multipages ; sans sitemap, Google découvre les pages uniquement via des liens crawlables, et si votre maillage interne est piloté en JavaScript, il peut ne rien trouver.
Test rapide : dans le HTML brut (curl), comptez les <a href> réels. Si votre navigation est faite de <div onClick> ou de <Link> qui ne génèrent pas d'ancre dans le HTML initial, vos routes profondes sont orphelines. Croisez avec un sitemap.xml exhaustif soumis en Search Console.
Étape 5 — Automatiser la détection du mismatch
Le diagnostic manuel ne tient pas à l'échelle. Inspecter dix URLs à la main fonctionne une fois ; le faire à chaque deploy sur 500 routes, non. C'est précisément ce que Seogard surveille en continu : il crawle vos URLs en deux passes — HTML brut puis rendu JS — et déclenche la règle ssr_content_mismatch quand le contenu rendu diverge du HTML servi. Les règles ssr_title_mismatch et rec_canonical_missing_in_ssr ciblent les cas où le <title> ou la canonical n'existent que dans le DOM rendu — exactement le scénario où Google arbitre entre deux versions contradictoires.
Le bénéfice : vous détectez la régression avant Google. Un commit qui passe une page de SSR à CSR pur, une dépendance qui crash le rendu, une route qui repart en page blanche — le contrôle échoue avant la mise en production. Vous pouvez même bloquer un déploiement régressif dans votre pipeline CI/CD plutôt que de le constater dans la Search Console des semaines plus tard.
Que faire une fois le diagnostic confirmé
Si le HTML brut est vide, la solution est structurelle, pas cosmétique : SSR, SSG ou prerendering pour servir du contenu dès la réponse initiale. Le framework importe peu — ce qui compte, c'est que la réponse HTML initiale contienne votre contenu.
Attention aux faux positifs côté CMS, fréquents en stack headless. Un champ SEO mal synchronisé peut servir un titre par défaut côté serveur pendant que le bon titre n'apparaît qu'en JS : c'est typiquement le cas d'un title injecté côté CSR où Google ne voit que la valeur par défaut. Le diagnostic est identique : comparez brut vs rendu, corrigez à la source, puis surveillez en continu depuis la plateforme de monitoring Seogard.
La règle d'or : ne supposez jamais ce que Google voit. Mesurez-le, sur chaque deploy.
Sources
- Outil d'inspection d'URL — Google Search Console
- Questions fréquentes sur l'exploration et l'indexation — Google Search Central