[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fP5eBbt7f2xqQCatJzsU3W4OvGrY98LYzbkzsR3AX4uM":3,"$f9dv0FL0zsTxdwWeII_pqp-PZCiEf3ZwuAxN2EyR230c":24},{"_id":4,"slug":5,"__v":6,"author":7,"body":8,"canonical":9,"category":10,"createdAt":11,"date":12,"description":13,"htmlContent":14,"image":15,"imageAlt":15,"readingTime":16,"tags":17,"title":22,"updatedAt":23},"69d8372aaa6b273b0cd3ab6d","refonte-de-site-les-20-verifications-seo-indispensables",0,"Equipe Seogard","Un e-commerce mode de 18 000 pages migre de Magento 1 vers Shopify. Recette validée, design approuvé, Go Live un vendredi soir. Le lundi matin, le trafic organique a chuté de 63%. Cause : 4 200 redirections 301 manquantes, un `noindex` global resté dans le thème Shopify, et des URLs de catégories complètement restructurées sans mapping. Trois mois pour revenir au niveau d'avant.\n\nCe scénario se reproduit chaque semaine. Voici les 20 vérifications qui l'auraient empêché.\n\n## Avant la refonte : préparer le terrain\n\n### 1. Crawl complet du site existant\n\nAvant de toucher quoi que ce soit, vous avez besoin d'un instantané exhaustif de l'état actuel. Pas un export Search Console partiel — un crawl complet avec Screaming Frog ou Sitebulb qui capture chaque URL, son status code, son title, sa meta description, ses canonicals, ses hreflang, son contenu indexable.\n\nPour un site de 18 000 pages, configurez Screaming Frog avec un crawl respectueux mais complet :\n\n```bash\n# Export CLI Screaming Frog — crawl complet avec sauvegarde\ncd /Applications/Screaming\\ Frog\\ SEO\\ Spider.app/Contents/MacOS/\n./ScreamingFrogSEOSpiderLauncher \\\n  --crawl https://www.monsite-ecommerce.fr \\\n  --headless \\\n  --save-crawl /exports/pre-migration-crawl.seospider \\\n  --export-tabs \"Internal:All,Response Codes:All,Page Titles:All,Meta Description:All,Canonicals:All,Directives:All,Hreflang:All\" \\\n  --output-folder /exports/pre-migration/ \\\n  --max-crawl-depth 0\n```\n\nCe fichier `.seospider` est votre assurance vie. Vous y reviendrez à chaque anomalie post-migration. Exportez les données en CSV et versionnez-les dans Git — vous aurez besoin de comparer avant/après sur chaque dimension.\n\n### 2. Identifier les pages à forte valeur SEO\n\nToutes les pages ne se valent pas. Croisez trois sources pour établir votre liste de pages critiques :\n\n- **Search Console** : pages avec impressions > 100/mois sur 12 mois (pas 3 mois — vous voulez capturer la saisonnalité)\n- **Analytics** : pages avec trafic organique > 0 sur 12 mois\n- **Backlinks** : pages avec au moins un domaine référent (export Ahrefs ou Majestic)\n\nL'union de ces trois ensembles constitue vos pages \"intouchables\". Chacune doit avoir une URL de destination mappée dans la nouvelle architecture. Si une page à 200 backlinks disparaît sans redirection, vous perdez toute l'autorité accumulée.\n\n### 3. Cartographier le mapping de redirections\n\nC'est le travail le plus chronophage et le plus critique. Chaque ancienne URL doit pointer vers la meilleure correspondance sur le nouveau site. Pas vers la homepage — vers la page sémantiquement la plus proche.\n\nPour un site de 18 000 pages, le mapping manuel est irréaliste. Automatisez la base avec un script qui matche par slug similarity :\n\n```python\nimport csv\nfrom difflib import SequenceMatcher\n\ndef best_match(old_url, new_urls, threshold=0.6):\n    old_path = old_url.split('/')[-1]\n    best = None\n    best_ratio = 0\n    for new_url in new_urls:\n        new_path = new_url.split('/')[-1]\n        ratio = SequenceMatcher(None, old_path, new_path).ratio()\n        if ratio > best_ratio:\n            best_ratio = ratio\n            best = new_url\n    return best if best_ratio >= threshold else None\n\n# Charger les URLs\nwith open('old_urls.csv') as f:\n    old_urls = [row['url'] for row in csv.DictReader(f)]\nwith open('new_urls.csv') as f:\n    new_urls = [row['url'] for row in csv.DictReader(f)]\n\n# Générer le mapping\nwith open('redirect_map.csv', 'w', newline='') as f:\n    writer = csv.writer(f)\n    writer.writerow(['old_url', 'new_url', 'confidence'])\n    for old in old_urls:\n        match = best_match(old, new_urls)\n        confidence = 'auto' if match else 'MANUAL_REVIEW'\n        writer.writerow([old, match or '', confidence])\n```\n\nRésultat : un CSV avec les matchs automatiques (confidence `auto`) et les URLs sans correspondance (confidence `MANUAL_REVIEW`). Les `MANUAL_REVIEW` passent entre les mains d'un humain qui connaît le catalogue. Ce script couvre typiquement 60-70% des cas sur un e-commerce dont les slugs produits sont conservés. Les 30-40% restants — catégories renommées, pages CMS restructurées — nécessitent un mapping manuel.\n\n### 4. Auditer les backlinks entrants\n\nExportez le profil de liens complet. Identifiez les pages qui reçoivent des backlinks et qui changent d'URL. Ces pages sont priorité absolue dans le mapping de redirections. Un lien du Monde.fr ou d'un blog influent de votre secteur qui atterrit sur une 404 est une perte sèche d'autorité.\n\nVérifiez aussi les backlinks qui pointent vers des URLs déjà en 404 ou en redirect chain sur le site actuel. La refonte est l'occasion de nettoyer ces chaînes.\n\n### 5. Documenter la structure technique actuelle\n\nNotez tout ce qui n'est pas visible dans un crawl standard :\n\n- Règles de réécriture dans `.htaccess` ou la config Nginx\n- Redirections existantes (il y en a souvent des centaines accumulées au fil des années)\n- Configuration des canonicals (sont-ils gérés côté app, côté serveur, ou par un plugin ?)\n- Sitemaps : combien, quelle fréquence de mise à jour, quelles URLs incluent-ils ?\n- Fichier `robots.txt` exact\n- Headers HTTP custom (X-Robots-Tag, cache headers)\n\nTout cela doit être reproduit ou consciemment modifié sur le nouveau site.\n\n## Pendant le développement : les contrôles en staging\n\n### 6. Environnement de staging bloqué aux robots\n\nAvant toute chose : votre environnement de staging ne doit pas être indexable. Ça paraît évident, mais c'est une source classique de [contenu dupliqué](/blog/contenu-duplique-causes-techniques-et-solutions). Deux protections complémentaires :\n\n```nginx\n# nginx.conf — staging\nserver {\n    listen 443 ssl;\n    server_name staging.monsite-ecommerce.fr;\n\n    # Protection par mot de passe\n    auth_basic \"Staging\";\n    auth_basic_user_file /etc/nginx/.htpasswd;\n\n    # Blocage robots en backup\n    add_header X-Robots-Tag \"noindex, nofollow\" always;\n\n    location /robots.txt {\n        return 200 \"User-agent: *\\nDisallow: /\\n\";\n    }\n}\n```\n\nLe `auth_basic` est la protection la plus fiable : Googlebot ne peut pas crawler un site protégé par mot de passe HTTP. Le `X-Robots-Tag` et le `robots.txt` sont des filets de sécurité supplémentaires. N'utilisez jamais une simple balise meta `noindex` en staging — le jour du Go Live, quelqu'un oubliera de la retirer. C'est exactement ce qui s'est passé dans le scénario d'introduction.\n\n### 7. Vérifier le rendu côté serveur (SSR)\n\nSi vous migrez vers un framework JavaScript (Next.js, Nuxt, SvelteKit), le SSR est non-négociable pour le SEO. Googlebot peut exécuter du JavaScript, mais avec des limites de rendu, un délai de queue, et des cas d'échec silencieux.\n\nTestez chaque template type avec `curl` pour vérifier que le HTML contient le contenu critique :\n\n```bash\n# Vérifier que le H1 est dans le HTML servi (pas injecté par JS)\ncurl -s https://staging.monsite-ecommerce.fr/robes/robe-longue-fleurie \\\n  | grep -o '\u003Ch1[^>]*>.*\u003C/h1>'\n\n# Vérifier la présence de la meta description\ncurl -s https://staging.monsite-ecommerce.fr/robes/robe-longue-fleurie \\\n  | grep -o '\u003Cmeta name=\"description\"[^>]*>'\n\n# Comparer le DOM servi vs DOM après exécution JS (via Puppeteer)\nnpx puppeteer-cli screenshot \\\n  --url https://staging.monsite-ecommerce.fr/robes/robe-longue-fleurie \\\n  --full-page \\\n  --output ssr-check.png\n```\n\nSi le `curl` ne retourne pas le H1 et la meta description, votre SSR est cassé ou inexistant. C'est le type de régression qu'un outil comme [Chrome DevTools](/blog/chrome-devtools-pour-le-seo-astuces-avancees) permet de diagnostiquer en inspectant la source vs le DOM rendu. Pour un monitoring continu, un outil comme Seogard détecte automatiquement la disparition de balises critiques entre deux crawls.\n\nSi vous migrez vers un [headless CMS](/blog/headless-cms-et-seo-avantages-et-risques-techniques), portez une attention particulière à la façon dont le contenu est servi : un front découplé qui fetch tout en client-side est invisible pour les crawlers qui n'exécutent pas le JavaScript.\n\n### 8. Valider les balises meta sur chaque template\n\nCrawlez votre staging avec Screaming Frog. Comparez les titles, meta descriptions et canonicals entre ancien site et nouveau site pour chaque catégorie de page (homepage, catégorie, produit, article, page CMS). Les problèmes les plus fréquents :\n\n- Title générique type \"Mon Site | Page\" au lieu du title optimisé\n- Meta description vide ou identique sur toutes les pages d'un même template\n- Canonical qui pointe vers l'URL de staging au lieu de la production\n- Canonical auto-référent manquant\n\n### 9. Contrôler la pagination et l'infinite scroll\n\nSi la nouvelle version remplace la pagination par de l'infinite scroll ou du \"Load More\", chaque page de résultats doit rester accessible via une URL crawlable. Sans cela, les produits au-delà de la première \"page\" deviennent invisibles pour Googlebot. Le sujet est suffisamment complexe pour justifier un traitement dédié — référez-vous à notre guide complet sur [l'infinite scroll et le SEO](/blog/infinite-scroll-et-seo-le-guide-technique).\n\n### 10. Tester les données structurées\n\nSi votre ancien site avait des données structurées (Product, Article, BreadcrumbList, FAQ), vérifiez qu'elles sont reproduites sur le nouveau site. Utilisez le test Rich Results de Google sur les URLs staging. Comparez le nombre de types de données structurées entre ancien et nouveau. Une migration qui fait disparaître les rich snippets produit un effet immédiat sur le CTR dans les SERPs.\n\n### 11. Vérifier la performance (Core Web Vitals)\n\nUne refonte qui dégrade les Core Web Vitals annule souvent les gains esthétiques. Testez avec Lighthouse CI sur vos templates principaux :\n\n```bash\n# Lighthouse CI — test de performance sur les templates critiques\nnpx lhci autorun --config=lighthouserc.json\n\n# lighthouserc.json\n{\n  \"ci\": {\n    \"collect\": {\n      \"url\": [\n        \"https://staging.monsite-ecommerce.fr/\",\n        \"https://staging.monsite-ecommerce.fr/robes/\",\n        \"https://staging.monsite-ecommerce.fr/robes/robe-longue-fleurie\",\n        \"https://staging.monsite-ecommerce.fr/blog/guide-tailles\"\n      ],\n      \"numberOfRuns\": 3\n    },\n    \"assert\": {\n      \"assertions\": {\n        \"categories:performance\": [\"error\", {\"minScore\": 0.8}],\n        \"first-contentful-paint\": [\"warn\", {\"maxNumericValue\": 2000}],\n        \"largest-contentful-paint\": [\"error\", {\"maxNumericValue\": 2500}],\n        \"cumulative-layout-shift\": [\"error\", {\"maxNumericValue\": 0.1}]\n      }\n    }\n  }\n}\n```\n\nIntégrez ces checks dans votre pipeline CI/CD. Un LCP qui passe de 1.8s à 4.2s parce que le nouveau thème charge des images non optimisées, ça se détecte avant la mise en production — pas après. Pour aller plus loin sur l'intégration de ces vérifications dans votre workflow de déploiement, consultez notre article sur [l'automatisation des checks SEO dans le CI/CD](/blog/automatiser-les-checks-seo-dans-le-ci-cd).\n\n### 12. Vérifier le robots.txt et les sitemaps\n\nComparez le `robots.txt` actuel et celui du nouveau site. Vérifiez que les sitemaps sont générés, valides et contiennent les bonnes URLs (nouvelles URLs, pas les anciennes). Un sitemap qui référence les anciennes URLs après migration envoie Googlebot dans une boucle de redirections.\n\n### 13. Auditer le maillage interne\n\nComparez le nombre de liens internes moyen par page entre ancien et nouveau site. Les refontes graphiques cassent souvent le maillage : un footer qui contenait 50 liens de catégories est remplacé par un design minimaliste avec 8 liens. Le mega-menu à 3 niveaux devient un hamburger menu. Résultat : des pages profondes qui passaient de 2 clics à 6 clics de la homepage.\n\nExportez le rapport \"Inlinks\" de Screaming Frog pour les deux versions. Si des pages stratégiques perdent plus de 50% de leurs liens entrants internes, corrigez l'architecture ou ajoutez des blocs de liens contextuels.\n\n### 14. Contrôler le contenu thin et dupliqué\n\nUne refonte est l'occasion de nettoyer les pages à faible valeur. Identifiez les pages avec moins de 300 mots de contenu unique, les pages quasi-dupliquées (filtres de catégories qui génèrent des centaines de combinaisons d'URL). Ces pages diluent le crawl budget et nuisent au SEO global — le problème du [thin content](/blog/thin-content-quand-vos-pages-nuisent-au-seo-global) est amplifié quand la nouvelle architecture multiplie les URLs paramétrées.\n\n## Le jour J : Go Live et vérifications immédiates\n\n### 15. Déployer et tester les redirections\n\nLe plan de redirections doit être actif dès la première seconde du Go Live. Testez immédiatement un échantillon de 50-100 URLs à forte valeur :\n\n```bash\n#!/bin/bash\n# test-redirects.sh — vérifier le mapping de redirections post-deploy\nwhile IFS=, read -r old_url new_url; do\n    status=$(curl -o /dev/null -s -w \"%{http_code}\" -L \"$old_url\")\n    final_url=$(curl -o /dev/null -s -w \"%{url_effective}\" -L \"$old_url\")\n\n    if [ \"$status\" != \"200\" ]; then\n        echo \"ERREUR: $old_url → status $status\"\n    elif [ \"$final_url\" != \"$new_url\" ]; then\n        echo \"MISMATCH: $old_url → $final_url (attendu: $new_url)\"\n    else\n        echo \"OK: $old_url → $new_url\"\n    fi\ndone \u003C redirect_sample.csv\n```\n\nCherchez spécifiquement :\n- Les 404 (redirection manquante)\n- Les redirect chains (301 → 301 → 200 : chaque maillon perd un peu de PageRank)\n- Les redirect loops (301 → 301 → 301 → timeout)\n- Les redirections vers la mauvaise page\n\nSi vous migrez aussi le protocole (HTTP vers HTTPS), les redirections s'empilent. Notre [checklist migration HTTPS](/blog/migration-http-vers-https-checklist-seo-complete) couvre les pièges spécifiques à cette couche.\n\n### 16. Retirer les blocages de staging\n\nVérification critique que tout le monde pense faire et que quelqu'un oublie toujours :\n\n- Le `robots.txt` de production autorise le crawl\n- Aucun `X-Robots-Tag: noindex` n'est envoyé en production\n- Aucune balise `\u003Cmeta name=\"robots\" content=\"noindex\">` n'est présente dans le `\u003Chead>`\n- Le `auth_basic` est désactivé\n\nTestez en production, pas seulement dans votre code. Un reverse proxy, un CDN, ou un middleware peut injecter des headers que votre application ne contrôle pas. Si vous utilisez un CDN avec des edge functions, vérifiez que les règles de [modification des réponses HTTP au niveau CDN](/blog/edge-seo-modifier-les-reponses-http-au-niveau-cdn) ne bloquent pas les crawlers.\n\n### 17. Soumettre les nouveaux sitemaps dans Search Console\n\nDès le Go Live :\n\n1. Ajoutez la propriété du nouveau site dans Search Console (si changement de domaine ou de protocole)\n2. Soumettez le sitemap mis à jour\n3. Utilisez l'outil \"Inspection de l'URL\" sur 10-15 pages stratégiques pour demander une indexation\n4. Si changement de domaine : utilisez l'outil \"Changement d'adresse\" dans Search Console\n\nNe supprimez pas l'ancienne propriété Search Console. Vous en aurez besoin pour comparer les données pendant au moins 6 mois. Les [rapports souvent ignorés de Search Console](/blog/google-search-console-les-rapports-que-vous-ignorez) sont particulièrement utiles dans cette phase pour détecter les problèmes d'indexation émergents.\n\n### 18. Surveiller les erreurs de crawl en temps réel\n\nDans les 48 heures post Go Live, surveillez :\n\n- Le rapport \"Pages\" (ex \"Couverture\") de Search Console : explosion des 404, des pages \"explorées mais non indexées\"\n- Les logs serveur : Googlebot qui crawle des URLs anciennes et reçoit des 404\n- Le taux de crawl : une chute brutale du crawl rate peut indiquer que Googlebot rencontre trop d'erreurs et ralentit\n\nL'analyse de logs est le signal le plus rapide. Search Console a un délai de 24-48h minimum. Les logs, eux, sont en temps réel.\n\n## Après la refonte : monitoring post-migration\n\n### 19. Comparer les KPIs semaine par semaine\n\nNe paniquez pas si le trafic baisse la première semaine — c'est normal le temps que Google recrawle et réindexe. Mais au-delà de 2-3 semaines, une baisse persistante indique un problème non résolu.\n\nSuivez ces indicateurs dans Search Console et votre outil d'analytics, semaine par semaine :\n\n- Nombre de pages indexées (doit revenir au niveau d'avant + les nouvelles pages)\n- Impressions organiques par section du site (homepage, catégories, produits, blog)\n- Position moyenne par groupe de mots-clés\n- Taux de crawl Googlebot (logs serveur)\n- Nombre de 404 crawlées par Googlebot\n\nSi vous perdez 30% d'impressions sur les pages catégories mais que les pages produits sont stables, le problème est localisé : le mapping de redirections des catégories est probablement défectueux, ou le nouveau maillage interne ne pousse plus assez ces pages. Pour structurer ce suivi, notre guide sur [les KPIs SEO technique à suivre](/blog/mesurer-l-impact-seo-technique-quels-kpis-suivre) détaille les métriques pertinentes et comment les automatiser.\n\n### 20. Recrawl complet post-migration et comparaison différentielle\n\nDeux semaines après le Go Live, lancez un crawl complet identique à celui du point 1. Comparez :\n\n- Nombre total d'URLs crawlées (ancien vs nouveau)\n- Distribution des status codes\n- Pages avec title manquant ou changé de façon non intentionnelle\n- Pages avec canonical incorrect\n- Pages avec `noindex` non prévu\n- Pages orphelines (présentes dans le sitemap mais sans lien interne)\n\nCette comparaison différentielle est le filet de sécurité final. Sur un site de 18 000 pages, des régressions passent toujours entre les mailles — un template de page marque qui a perdu sa meta description, une redirection de catégorie saisonnière oubliée, un paramètre de filtre qui génère des milliers de pages dupliquées.\n\nC'est précisément ce type de monitoring continu — détecter qu'une meta description a disparu ou qu'un canonical a changé entre deux crawls — que Seogard automatise. Plutôt que de lancer manuellement des crawls comparatifs, vous recevez une alerte dès qu'une régression apparaît.\n\n## Scénario complet : migration e-commerce Magento → Shopify\n\nPour rendre tout cela concret, voici le déroulé réel d'une migration bien exécutée :\n\n**Contexte** : e-commerce de prêt-à-porter, 15 200 pages indexées (8 400 produits, 320 catégories, 180 articles blog, le reste en pages CMS et filtres). Trafic organique : 145 000 sessions/mois. Migration de Magento 1.9 vers Shopify Plus.\n\n**Semaine -8 à -4** : crawl complet Screaming Frog (durée : 4h12 pour 15 200 pages). Export backlinks Ahrefs : 2 340 domaines référents, dont 890 pointant vers des pages produits spécifiques. Identification de 3 200 pages à forte valeur (trafic + backlinks). Mapping automatisé : 67% des URLs matchées par slug similarity. 33% en revue manuelle (3 jours de travail à deux personnes).\n\n**Semaine -4 à -1** : développement sur staging protégé par `auth_basic`. Crawl du staging : détection de 48 pages avec meta description manquante (bug template collection), correction du thème Liquid. Test SSR : N/A (Shopify gère le rendu). Lighthouse : LCP moyen à 2.1s (acceptable). Données structurées Product validées sur 20 URLs échantillon.\n\n**Jour J (mardi 10h)** : déploiement des 15 200 redirections via app Shopify (bulk import CSV). Test automatisé de 200 redirections : 3 erreurs détectées et corrigées en 30 minutes. Soumission sitemap. Vérification `robots.txt`. Monitoring logs : Googlebot commence à crawler à 11h47, taux normal.\n\n**Semaine +1** : baisse de 18% du trafic organique. Normal — Google recrawle et réévalue. 47 nouvelles 404 détectées dans Search Console (pages avec paramètres UTM ou URLs non nettoyées). Ajout de redirections complémentaires.\n\n**Semaine +3** : trafic revenu à 94% du niveau pré-migration. Les 6% manquants correspondent à des pages thin content qui n'ont intentionnellement pas été migrées.\n\n**Semaine +8** : trafic à 103% du niveau pré-migration, grâce à l'amélioration des Core Web Vitals et au nettoyage du contenu thin.\n\n## Le vrai coût d'une vérification manquée\n\nChaque point de cette checklist semble individuellemement simple. Le danger d'une refonte, c'est l'accumulation : un `noindex` oublié ici, 200 redirections manquantes là, un maillage interne appauvri, des canonicals qui pointent vers le staging. Chaque défaut pris isolément est mineur. Combinés, ils provoquent l'effondrement du trafic organique.\n\nLa clé : automatiser tout ce qui peut l'être (redirections, tests de régression, monitoring), et réserver le temps humain aux décisions qui nécessitent du jugement (mapping sémantique, arbitrages d'architecture, priorisation des pages). Intégrez vos vérifications SEO dans le pipeline CI/CD, crawlez votre staging aussi souvent que votre production, et mettez en place un monitoring différentiel permanent post-migration. C'est la seule façon de transformer une refonte d'un risque SEO en opportunité.\n```","https://seogard.io/blog/refonte-de-site-les-20-verifications-seo-indispensables","Migration","2026-04-09T23:32:58.408Z","2026-04-09","Checklist technique complète pour réussir une refonte sans perdre de trafic organique. 20 points de contrôle concrets avec code et config.","\u003Cp>Un e-commerce mode de 18 000 pages migre de Magento 1 vers Shopify. Recette validée, design approuvé, Go Live un vendredi soir. Le lundi matin, le trafic organique a chuté de 63%. Cause : 4 200 redirections 301 manquantes, un \u003Ccode>noindex\u003C/code> global resté dans le thème Shopify, et des URLs de catégories complètement restructurées sans mapping. Trois mois pour revenir au niveau d'avant.\u003C/p>\n\u003Cp>Ce scénario se reproduit chaque semaine. Voici les 20 vérifications qui l'auraient empêché.\u003C/p>\n\u003Ch2>Avant la refonte : préparer le terrain\u003C/h2>\n\u003Ch3>1. Crawl complet du site existant\u003C/h3>\n\u003Cp>Avant de toucher quoi que ce soit, vous avez besoin d'un instantané exhaustif de l'état actuel. Pas un export Search Console partiel — un crawl complet avec Screaming Frog ou Sitebulb qui capture chaque URL, son status code, son title, sa meta description, ses canonicals, ses hreflang, son contenu indexable.\u003C/p>\n\u003Cp>Pour un site de 18 000 pages, configurez Screaming Frog avec un crawl respectueux mais complet :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Export CLI Screaming Frog — crawl complet avec sauvegarde\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">cd\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> /Applications/Screaming\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\ \u003C/span>\u003Cspan style=\"color:#9ECBFF\">Frog\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\ \u003C/span>\u003Cspan style=\"color:#9ECBFF\">SEO\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\ \u003C/span>\u003Cspan style=\"color:#9ECBFF\">Spider.app/Contents/MacOS/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">./ScreamingFrogSEOSpiderLauncher\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  --crawl\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> https://www.monsite-ecommerce.fr\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  --headless\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  --save-crawl\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> /exports/pre-migration-crawl.seospider\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  --export-tabs\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"Internal:All,Response Codes:All,Page Titles:All,Meta Description:All,Canonicals:All,Directives:All,Hreflang:All\"\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  --output-folder\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> /exports/pre-migration/\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  --max-crawl-depth\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 0\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Ce fichier \u003Ccode>.seospider\u003C/code> est votre assurance vie. Vous y reviendrez à chaque anomalie post-migration. Exportez les données en CSV et versionnez-les dans Git — vous aurez besoin de comparer avant/après sur chaque dimension.\u003C/p>\n\u003Ch3>2. Identifier les pages à forte valeur SEO\u003C/h3>\n\u003Cp>Toutes les pages ne se valent pas. Croisez trois sources pour établir votre liste de pages critiques :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Search Console\u003C/strong> : pages avec impressions > 100/mois sur 12 mois (pas 3 mois — vous voulez capturer la saisonnalité)\u003C/li>\n\u003Cli>\u003Cstrong>Analytics\u003C/strong> : pages avec trafic organique > 0 sur 12 mois\u003C/li>\n\u003Cli>\u003Cstrong>Backlinks\u003C/strong> : pages avec au moins un domaine référent (export Ahrefs ou Majestic)\u003C/li>\n\u003C/ul>\n\u003Cp>L'union de ces trois ensembles constitue vos pages \"intouchables\". Chacune doit avoir une URL de destination mappée dans la nouvelle architecture. Si une page à 200 backlinks disparaît sans redirection, vous perdez toute l'autorité accumulée.\u003C/p>\n\u003Ch3>3. Cartographier le mapping de redirections\u003C/h3>\n\u003Cp>C'est le travail le plus chronophage et le plus critique. Chaque ancienne URL doit pointer vers la meilleure correspondance sur le nouveau site. Pas vers la homepage — vers la page sémantiquement la plus proche.\u003C/p>\n\u003Cp>Pour un site de 18 000 pages, le mapping manuel est irréaliste. Automatisez la base avec un script qui matche par slug similarity :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> csv\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> difflib \u003C/span>\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> SequenceMatcher\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">def\u003C/span>\u003Cspan style=\"color:#B392F0\"> best_match\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(old_url, new_urls, threshold\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#79B8FF\">0.6\u003C/span>\u003Cspan style=\"color:#E1E4E8\">):\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    old_path \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> old_url.split(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'/'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)[\u003C/span>\u003Cspan style=\"color:#F97583\">-\u003C/span>\u003Cspan style=\"color:#79B8FF\">1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    best \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#79B8FF\"> None\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    best_ratio \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 0\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    for\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> new_url \u003C/span>\u003Cspan style=\"color:#F97583\">in\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> new_urls:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        new_path \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> new_url.split(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'/'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)[\u003C/span>\u003Cspan style=\"color:#F97583\">-\u003C/span>\u003Cspan style=\"color:#79B8FF\">1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        ratio \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> SequenceMatcher(\u003C/span>\u003Cspan style=\"color:#79B8FF\">None\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, old_path, new_path).ratio()\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ratio \u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> best_ratio:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            best_ratio \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ratio\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            best \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> new_url\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> best \u003C/span>\u003Cspan style=\"color:#F97583\">if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> best_ratio \u003C/span>\u003Cspan style=\"color:#F97583\">>=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> threshold \u003C/span>\u003Cspan style=\"color:#F97583\">else\u003C/span>\u003Cspan style=\"color:#79B8FF\"> None\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Charger les URLs\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">with\u003C/span>\u003Cspan style=\"color:#79B8FF\"> open\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'old_urls.csv'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">as\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> f:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    old_urls \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [row[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'url'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">] \u003C/span>\u003Cspan style=\"color:#F97583\">for\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> row \u003C/span>\u003Cspan style=\"color:#F97583\">in\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> csv.DictReader(f)]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">with\u003C/span>\u003Cspan style=\"color:#79B8FF\"> open\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'new_urls.csv'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">as\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> f:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    new_urls \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [row[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'url'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">] \u003C/span>\u003Cspan style=\"color:#F97583\">for\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> row \u003C/span>\u003Cspan style=\"color:#F97583\">in\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> csv.DictReader(f)]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Générer le mapping\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">with\u003C/span>\u003Cspan style=\"color:#79B8FF\"> open\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'redirect_map.csv'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'w'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#FFAB70\">newline\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">''\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">as\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> f:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    writer \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> csv.writer(f)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    writer.writerow([\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'old_url'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'new_url'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'confidence'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">])\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    for\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> old \u003C/span>\u003Cspan style=\"color:#F97583\">in\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> old_urls:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        match \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> best_match(old, new_urls)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        confidence \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'auto'\u003C/span>\u003Cspan style=\"color:#F97583\"> if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> match \u003C/span>\u003Cspan style=\"color:#F97583\">else\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'MANUAL_REVIEW'\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        writer.writerow([old, match \u003C/span>\u003Cspan style=\"color:#F97583\">or\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> ''\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, confidence])\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Résultat : un CSV avec les matchs automatiques (confidence \u003Ccode>auto\u003C/code>) et les URLs sans correspondance (confidence \u003Ccode>MANUAL_REVIEW\u003C/code>). Les \u003Ccode>MANUAL_REVIEW\u003C/code> passent entre les mains d'un humain qui connaît le catalogue. Ce script couvre typiquement 60-70% des cas sur un e-commerce dont les slugs produits sont conservés. Les 30-40% restants — catégories renommées, pages CMS restructurées — nécessitent un mapping manuel.\u003C/p>\n\u003Ch3>4. Auditer les backlinks entrants\u003C/h3>\n\u003Cp>Exportez le profil de liens complet. Identifiez les pages qui reçoivent des backlinks et qui changent d'URL. Ces pages sont priorité absolue dans le mapping de redirections. Un lien du Monde.fr ou d'un blog influent de votre secteur qui atterrit sur une 404 est une perte sèche d'autorité.\u003C/p>\n\u003Cp>Vérifiez aussi les backlinks qui pointent vers des URLs déjà en 404 ou en redirect chain sur le site actuel. La refonte est l'occasion de nettoyer ces chaînes.\u003C/p>\n\u003Ch3>5. Documenter la structure technique actuelle\u003C/h3>\n\u003Cp>Notez tout ce qui n'est pas visible dans un crawl standard :\u003C/p>\n\u003Cul>\n\u003Cli>Règles de réécriture dans \u003Ccode>.htaccess\u003C/code> ou la config Nginx\u003C/li>\n\u003Cli>Redirections existantes (il y en a souvent des centaines accumulées au fil des années)\u003C/li>\n\u003Cli>Configuration des canonicals (sont-ils gérés côté app, côté serveur, ou par un plugin ?)\u003C/li>\n\u003Cli>Sitemaps : combien, quelle fréquence de mise à jour, quelles URLs incluent-ils ?\u003C/li>\n\u003Cli>Fichier \u003Ccode>robots.txt\u003C/code> exact\u003C/li>\n\u003Cli>Headers HTTP custom (X-Robots-Tag, cache headers)\u003C/li>\n\u003C/ul>\n\u003Cp>Tout cela doit être reproduit ou consciemment modifié sur le nouveau site.\u003C/p>\n\u003Ch2>Pendant le développement : les contrôles en staging\u003C/h2>\n\u003Ch3>6. Environnement de staging bloqué aux robots\u003C/h3>\n\u003Cp>Avant toute chose : votre environnement de staging ne doit pas être indexable. Ça paraît évident, mais c'est une source classique de \u003Ca href=\"/blog/contenu-duplique-causes-techniques-et-solutions\">contenu dupliqué\u003C/a>. Deux protections complémentaires :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># nginx.conf — staging\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">server\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    listen \u003C/span>\u003Cspan style=\"color:#79B8FF\">443\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ssl;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    server_name \u003C/span>\u003Cspan style=\"color:#E1E4E8\">staging.monsite-ecommerce.fr;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    # Protection par mot de passe\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    auth_basic \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Staging\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    auth_basic_user_file \u003C/span>\u003Cspan style=\"color:#E1E4E8\">/etc/nginx/.htpasswd;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    # Blocage robots en backup\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    add_header \u003C/span>\u003Cspan style=\"color:#E1E4E8\">X-Robots-Tag \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"noindex, nofollow\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> always;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    location\u003C/span>\u003Cspan style=\"color:#B392F0\"> /robots.txt \u003C/span>\u003Cspan style=\"color:#E1E4E8\">{\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        return\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 200\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"User-agent: *\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\n\u003C/span>\u003Cspan style=\"color:#9ECBFF\">Disallow: /\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\n\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Le \u003Ccode>auth_basic\u003C/code> est la protection la plus fiable : Googlebot ne peut pas crawler un site protégé par mot de passe HTTP. Le \u003Ccode>X-Robots-Tag\u003C/code> et le \u003Ccode>robots.txt\u003C/code> sont des filets de sécurité supplémentaires. N'utilisez jamais une simple balise meta \u003Ccode>noindex\u003C/code> en staging — le jour du Go Live, quelqu'un oubliera de la retirer. C'est exactement ce qui s'est passé dans le scénario d'introduction.\u003C/p>\n\u003Ch3>7. Vérifier le rendu côté serveur (SSR)\u003C/h3>\n\u003Cp>Si vous migrez vers un framework JavaScript (Next.js, Nuxt, SvelteKit), le SSR est non-négociable pour le SEO. Googlebot peut exécuter du JavaScript, mais avec des limites de rendu, un délai de queue, et des cas d'échec silencieux.\u003C/p>\n\u003Cp>Testez chaque template type avec \u003Ccode>curl\u003C/code> pour vérifier que le HTML contient le contenu critique :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Vérifier que le H1 est dans le HTML servi (pas injecté par JS)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">curl\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -s\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> https://staging.monsite-ecommerce.fr/robes/robe-longue-fleurie\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  |\u003C/span>\u003Cspan style=\"color:#B392F0\"> grep\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -o\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '&#x3C;h1[^>]*>.*&#x3C;/h1>'\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Vérifier la présence de la meta description\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">curl\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -s\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> https://staging.monsite-ecommerce.fr/robes/robe-longue-fleurie\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  |\u003C/span>\u003Cspan style=\"color:#B392F0\"> grep\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -o\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '&#x3C;meta name=\"description\"[^>]*>'\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Comparer le DOM servi vs DOM après exécution JS (via Puppeteer)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">npx\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> puppeteer-cli\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> screenshot\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  --url\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> https://staging.monsite-ecommerce.fr/robes/robe-longue-fleurie\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  --full-page\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  --output\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> ssr-check.png\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Si le \u003Ccode>curl\u003C/code> ne retourne pas le H1 et la meta description, votre SSR est cassé ou inexistant. C'est le type de régression qu'un outil comme \u003Ca href=\"/blog/chrome-devtools-pour-le-seo-astuces-avancees\">Chrome DevTools\u003C/a> permet de diagnostiquer en inspectant la source vs le DOM rendu. Pour un monitoring continu, un outil comme Seogard détecte automatiquement la disparition de balises critiques entre deux crawls.\u003C/p>\n\u003Cp>Si vous migrez vers un \u003Ca href=\"/blog/headless-cms-et-seo-avantages-et-risques-techniques\">headless CMS\u003C/a>, portez une attention particulière à la façon dont le contenu est servi : un front découplé qui fetch tout en client-side est invisible pour les crawlers qui n'exécutent pas le JavaScript.\u003C/p>\n\u003Ch3>8. Valider les balises meta sur chaque template\u003C/h3>\n\u003Cp>Crawlez votre staging avec Screaming Frog. Comparez les titles, meta descriptions et canonicals entre ancien site et nouveau site pour chaque catégorie de page (homepage, catégorie, produit, article, page CMS). Les problèmes les plus fréquents :\u003C/p>\n\u003Cul>\n\u003Cli>Title générique type \"Mon Site | Page\" au lieu du title optimisé\u003C/li>\n\u003Cli>Meta description vide ou identique sur toutes les pages d'un même template\u003C/li>\n\u003Cli>Canonical qui pointe vers l'URL de staging au lieu de la production\u003C/li>\n\u003Cli>Canonical auto-référent manquant\u003C/li>\n\u003C/ul>\n\u003Ch3>9. Contrôler la pagination et l'infinite scroll\u003C/h3>\n\u003Cp>Si la nouvelle version remplace la pagination par de l'infinite scroll ou du \"Load More\", chaque page de résultats doit rester accessible via une URL crawlable. Sans cela, les produits au-delà de la première \"page\" deviennent invisibles pour Googlebot. Le sujet est suffisamment complexe pour justifier un traitement dédié — référez-vous à notre guide complet sur \u003Ca href=\"/blog/infinite-scroll-et-seo-le-guide-technique\">l'infinite scroll et le SEO\u003C/a>.\u003C/p>\n\u003Ch3>10. Tester les données structurées\u003C/h3>\n\u003Cp>Si votre ancien site avait des données structurées (Product, Article, BreadcrumbList, FAQ), vérifiez qu'elles sont reproduites sur le nouveau site. Utilisez le test Rich Results de Google sur les URLs staging. Comparez le nombre de types de données structurées entre ancien et nouveau. Une migration qui fait disparaître les rich snippets produit un effet immédiat sur le CTR dans les SERPs.\u003C/p>\n\u003Ch3>11. Vérifier la performance (Core Web Vitals)\u003C/h3>\n\u003Cp>Une refonte qui dégrade les Core Web Vitals annule souvent les gains esthétiques. Testez avec Lighthouse CI sur vos templates principaux :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Lighthouse CI — test de performance sur les templates critiques\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">npx\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> lhci\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> autorun\u003C/span>\u003Cspan style=\"color:#79B8FF\"> --config=lighthouserc.json\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># lighthouserc.json\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">{\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">  \"ci\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">:\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">    \"collect\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">:\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">      \"url\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">:\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">        \"https://staging.monsite-ecommerce.fr/\"\u003C/span>\u003Cspan style=\"color:#B392F0\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">        \"https://staging.monsite-ecommerce.fr/robes/\"\u003C/span>\u003Cspan style=\"color:#B392F0\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">        \"https://staging.monsite-ecommerce.fr/robes/robe-longue-fleurie\"\u003C/span>\u003Cspan style=\"color:#B392F0\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">        \"https://staging.monsite-ecommerce.fr/blog/guide-tailles\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      ],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">      \"numberOfRuns\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 3\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">    \"assert\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">:\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">      \"assertions\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">:\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">        \"categories:performance\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">:\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"error\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">{\"minScore\":\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 0.8\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">        \"first-contentful-paint\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">:\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"warn\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">{\"maxNumericValue\":\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 2000\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">        \"largest-contentful-paint\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">:\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"error\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">{\"maxNumericValue\":\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 2500\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">        \"cumulative-layout-shift\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">:\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"error\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">{\"maxNumericValue\":\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 0.1\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Intégrez ces checks dans votre pipeline CI/CD. Un LCP qui passe de 1.8s à 4.2s parce que le nouveau thème charge des images non optimisées, ça se détecte avant la mise en production — pas après. Pour aller plus loin sur l'intégration de ces vérifications dans votre workflow de déploiement, consultez notre article sur \u003Ca href=\"/blog/automatiser-les-checks-seo-dans-le-ci-cd\">l'automatisation des checks SEO dans le CI/CD\u003C/a>.\u003C/p>\n\u003Ch3>12. Vérifier le robots.txt et les sitemaps\u003C/h3>\n\u003Cp>Comparez le \u003Ccode>robots.txt\u003C/code> actuel et celui du nouveau site. Vérifiez que les sitemaps sont générés, valides et contiennent les bonnes URLs (nouvelles URLs, pas les anciennes). Un sitemap qui référence les anciennes URLs après migration envoie Googlebot dans une boucle de redirections.\u003C/p>\n\u003Ch3>13. Auditer le maillage interne\u003C/h3>\n\u003Cp>Comparez le nombre de liens internes moyen par page entre ancien et nouveau site. Les refontes graphiques cassent souvent le maillage : un footer qui contenait 50 liens de catégories est remplacé par un design minimaliste avec 8 liens. Le mega-menu à 3 niveaux devient un hamburger menu. Résultat : des pages profondes qui passaient de 2 clics à 6 clics de la homepage.\u003C/p>\n\u003Cp>Exportez le rapport \"Inlinks\" de Screaming Frog pour les deux versions. Si des pages stratégiques perdent plus de 50% de leurs liens entrants internes, corrigez l'architecture ou ajoutez des blocs de liens contextuels.\u003C/p>\n\u003Ch3>14. Contrôler le contenu thin et dupliqué\u003C/h3>\n\u003Cp>Une refonte est l'occasion de nettoyer les pages à faible valeur. Identifiez les pages avec moins de 300 mots de contenu unique, les pages quasi-dupliquées (filtres de catégories qui génèrent des centaines de combinaisons d'URL). Ces pages diluent le crawl budget et nuisent au SEO global — le problème du \u003Ca href=\"/blog/thin-content-quand-vos-pages-nuisent-au-seo-global\">thin content\u003C/a> est amplifié quand la nouvelle architecture multiplie les URLs paramétrées.\u003C/p>\n\u003Ch2>Le jour J : Go Live et vérifications immédiates\u003C/h2>\n\u003Ch3>15. Déployer et tester les redirections\u003C/h3>\n\u003Cp>Le plan de redirections doit être actif dès la première seconde du Go Live. Testez immédiatement un échantillon de 50-100 URLs à forte valeur :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">#!/bin/bash\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># test-redirects.sh — vérifier le mapping de redirections post-deploy\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">while\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> IFS\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">,\u003C/span>\u003Cspan style=\"color:#79B8FF\"> read\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -r\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> old_url\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> new_url\u003C/span>\u003Cspan style=\"color:#E1E4E8\">; \u003C/span>\u003Cspan style=\"color:#F97583\">do\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    status\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$(\u003C/span>\u003Cspan style=\"color:#B392F0\">curl\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -o\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> /dev/null\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -s\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -w\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"%{http_code}\"\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -L\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$old_url\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    final_url\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$(\u003C/span>\u003Cspan style=\"color:#B392F0\">curl\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -o\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> /dev/null\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -s\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -w\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"%{url_effective}\"\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -L\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$old_url\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [ \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$status\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#F97583\"> !=\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"200\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ]; \u003C/span>\u003Cspan style=\"color:#F97583\">then\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        echo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"ERREUR: \u003C/span>\u003Cspan style=\"color:#E1E4E8\">$old_url\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> → status \u003C/span>\u003Cspan style=\"color:#E1E4E8\">$status\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    elif\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [ \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$final_url\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#F97583\"> !=\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$new_url\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ]; \u003C/span>\u003Cspan style=\"color:#F97583\">then\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        echo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"MISMATCH: \u003C/span>\u003Cspan style=\"color:#E1E4E8\">$old_url\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> → \u003C/span>\u003Cspan style=\"color:#E1E4E8\">$final_url\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> (attendu: \u003C/span>\u003Cspan style=\"color:#E1E4E8\">$new_url\u003C/span>\u003Cspan style=\"color:#9ECBFF\">)\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    else\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        echo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"OK: \u003C/span>\u003Cspan style=\"color:#E1E4E8\">$old_url\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> → \u003C/span>\u003Cspan style=\"color:#E1E4E8\">$new_url\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    fi\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">done\u003C/span>\u003Cspan style=\"color:#F97583\"> &#x3C;\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> redirect_sample.csv\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Cherchez spécifiquement :\u003C/p>\n\u003Cul>\n\u003Cli>Les 404 (redirection manquante)\u003C/li>\n\u003Cli>Les redirect chains (301 → 301 → 200 : chaque maillon perd un peu de PageRank)\u003C/li>\n\u003Cli>Les redirect loops (301 → 301 → 301 → timeout)\u003C/li>\n\u003Cli>Les redirections vers la mauvaise page\u003C/li>\n\u003C/ul>\n\u003Cp>Si vous migrez aussi le protocole (HTTP vers HTTPS), les redirections s'empilent. Notre \u003Ca href=\"/blog/migration-http-vers-https-checklist-seo-complete\">checklist migration HTTPS\u003C/a> couvre les pièges spécifiques à cette couche.\u003C/p>\n\u003Ch3>16. Retirer les blocages de staging\u003C/h3>\n\u003Cp>Vérification critique que tout le monde pense faire et que quelqu'un oublie toujours :\u003C/p>\n\u003Cul>\n\u003Cli>Le \u003Ccode>robots.txt\u003C/code> de production autorise le crawl\u003C/li>\n\u003Cli>Aucun \u003Ccode>X-Robots-Tag: noindex\u003C/code> n'est envoyé en production\u003C/li>\n\u003Cli>Aucune balise \u003Ccode>&#x3C;meta name=\"robots\" content=\"noindex\">\u003C/code> n'est présente dans le \u003Ccode>&#x3C;head>\u003C/code>\u003C/li>\n\u003Cli>Le \u003Ccode>auth_basic\u003C/code> est désactivé\u003C/li>\n\u003C/ul>\n\u003Cp>Testez en production, pas seulement dans votre code. Un reverse proxy, un CDN, ou un middleware peut injecter des headers que votre application ne contrôle pas. Si vous utilisez un CDN avec des edge functions, vérifiez que les règles de \u003Ca href=\"/blog/edge-seo-modifier-les-reponses-http-au-niveau-cdn\">modification des réponses HTTP au niveau CDN\u003C/a> ne bloquent pas les crawlers.\u003C/p>\n\u003Ch3>17. Soumettre les nouveaux sitemaps dans Search Console\u003C/h3>\n\u003Cp>Dès le Go Live :\u003C/p>\n\u003Col>\n\u003Cli>Ajoutez la propriété du nouveau site dans Search Console (si changement de domaine ou de protocole)\u003C/li>\n\u003Cli>Soumettez le sitemap mis à jour\u003C/li>\n\u003Cli>Utilisez l'outil \"Inspection de l'URL\" sur 10-15 pages stratégiques pour demander une indexation\u003C/li>\n\u003Cli>Si changement de domaine : utilisez l'outil \"Changement d'adresse\" dans Search Console\u003C/li>\n\u003C/ol>\n\u003Cp>Ne supprimez pas l'ancienne propriété Search Console. Vous en aurez besoin pour comparer les données pendant au moins 6 mois. Les \u003Ca href=\"/blog/google-search-console-les-rapports-que-vous-ignorez\">rapports souvent ignorés de Search Console\u003C/a> sont particulièrement utiles dans cette phase pour détecter les problèmes d'indexation émergents.\u003C/p>\n\u003Ch3>18. Surveiller les erreurs de crawl en temps réel\u003C/h3>\n\u003Cp>Dans les 48 heures post Go Live, surveillez :\u003C/p>\n\u003Cul>\n\u003Cli>Le rapport \"Pages\" (ex \"Couverture\") de Search Console : explosion des 404, des pages \"explorées mais non indexées\"\u003C/li>\n\u003Cli>Les logs serveur : Googlebot qui crawle des URLs anciennes et reçoit des 404\u003C/li>\n\u003Cli>Le taux de crawl : une chute brutale du crawl rate peut indiquer que Googlebot rencontre trop d'erreurs et ralentit\u003C/li>\n\u003C/ul>\n\u003Cp>L'analyse de logs est le signal le plus rapide. Search Console a un délai de 24-48h minimum. Les logs, eux, sont en temps réel.\u003C/p>\n\u003Ch2>Après la refonte : monitoring post-migration\u003C/h2>\n\u003Ch3>19. Comparer les KPIs semaine par semaine\u003C/h3>\n\u003Cp>Ne paniquez pas si le trafic baisse la première semaine — c'est normal le temps que Google recrawle et réindexe. Mais au-delà de 2-3 semaines, une baisse persistante indique un problème non résolu.\u003C/p>\n\u003Cp>Suivez ces indicateurs dans Search Console et votre outil d'analytics, semaine par semaine :\u003C/p>\n\u003Cul>\n\u003Cli>Nombre de pages indexées (doit revenir au niveau d'avant + les nouvelles pages)\u003C/li>\n\u003Cli>Impressions organiques par section du site (homepage, catégories, produits, blog)\u003C/li>\n\u003Cli>Position moyenne par groupe de mots-clés\u003C/li>\n\u003Cli>Taux de crawl Googlebot (logs serveur)\u003C/li>\n\u003Cli>Nombre de 404 crawlées par Googlebot\u003C/li>\n\u003C/ul>\n\u003Cp>Si vous perdez 30% d'impressions sur les pages catégories mais que les pages produits sont stables, le problème est localisé : le mapping de redirections des catégories est probablement défectueux, ou le nouveau maillage interne ne pousse plus assez ces pages. Pour structurer ce suivi, notre guide sur \u003Ca href=\"/blog/mesurer-l-impact-seo-technique-quels-kpis-suivre\">les KPIs SEO technique à suivre\u003C/a> détaille les métriques pertinentes et comment les automatiser.\u003C/p>\n\u003Ch3>20. Recrawl complet post-migration et comparaison différentielle\u003C/h3>\n\u003Cp>Deux semaines après le Go Live, lancez un crawl complet identique à celui du point 1. Comparez :\u003C/p>\n\u003Cul>\n\u003Cli>Nombre total d'URLs crawlées (ancien vs nouveau)\u003C/li>\n\u003Cli>Distribution des status codes\u003C/li>\n\u003Cli>Pages avec title manquant ou changé de façon non intentionnelle\u003C/li>\n\u003Cli>Pages avec canonical incorrect\u003C/li>\n\u003Cli>Pages avec \u003Ccode>noindex\u003C/code> non prévu\u003C/li>\n\u003Cli>Pages orphelines (présentes dans le sitemap mais sans lien interne)\u003C/li>\n\u003C/ul>\n\u003Cp>Cette comparaison différentielle est le filet de sécurité final. Sur un site de 18 000 pages, des régressions passent toujours entre les mailles — un template de page marque qui a perdu sa meta description, une redirection de catégorie saisonnière oubliée, un paramètre de filtre qui génère des milliers de pages dupliquées.\u003C/p>\n\u003Cp>C'est précisément ce type de monitoring continu — détecter qu'une meta description a disparu ou qu'un canonical a changé entre deux crawls — que Seogard automatise. Plutôt que de lancer manuellement des crawls comparatifs, vous recevez une alerte dès qu'une régression apparaît.\u003C/p>\n\u003Ch2>Scénario complet : migration e-commerce Magento → Shopify\u003C/h2>\n\u003Cp>Pour rendre tout cela concret, voici le déroulé réel d'une migration bien exécutée :\u003C/p>\n\u003Cp>\u003Cstrong>Contexte\u003C/strong> : e-commerce de prêt-à-porter, 15 200 pages indexées (8 400 produits, 320 catégories, 180 articles blog, le reste en pages CMS et filtres). Trafic organique : 145 000 sessions/mois. Migration de Magento 1.9 vers Shopify Plus.\u003C/p>\n\u003Cp>\u003Cstrong>Semaine -8 à -4\u003C/strong> : crawl complet Screaming Frog (durée : 4h12 pour 15 200 pages). Export backlinks Ahrefs : 2 340 domaines référents, dont 890 pointant vers des pages produits spécifiques. Identification de 3 200 pages à forte valeur (trafic + backlinks). Mapping automatisé : 67% des URLs matchées par slug similarity. 33% en revue manuelle (3 jours de travail à deux personnes).\u003C/p>\n\u003Cp>\u003Cstrong>Semaine -4 à -1\u003C/strong> : développement sur staging protégé par \u003Ccode>auth_basic\u003C/code>. Crawl du staging : détection de 48 pages avec meta description manquante (bug template collection), correction du thème Liquid. Test SSR : N/A (Shopify gère le rendu). Lighthouse : LCP moyen à 2.1s (acceptable). Données structurées Product validées sur 20 URLs échantillon.\u003C/p>\n\u003Cp>\u003Cstrong>Jour J (mardi 10h)\u003C/strong> : déploiement des 15 200 redirections via app Shopify (bulk import CSV). Test automatisé de 200 redirections : 3 erreurs détectées et corrigées en 30 minutes. Soumission sitemap. Vérification \u003Ccode>robots.txt\u003C/code>. Monitoring logs : Googlebot commence à crawler à 11h47, taux normal.\u003C/p>\n\u003Cp>\u003Cstrong>Semaine +1\u003C/strong> : baisse de 18% du trafic organique. Normal — Google recrawle et réévalue. 47 nouvelles 404 détectées dans Search Console (pages avec paramètres UTM ou URLs non nettoyées). Ajout de redirections complémentaires.\u003C/p>\n\u003Cp>\u003Cstrong>Semaine +3\u003C/strong> : trafic revenu à 94% du niveau pré-migration. Les 6% manquants correspondent à des pages thin content qui n'ont intentionnellement pas été migrées.\u003C/p>\n\u003Cp>\u003Cstrong>Semaine +8\u003C/strong> : trafic à 103% du niveau pré-migration, grâce à l'amélioration des Core Web Vitals et au nettoyage du contenu thin.\u003C/p>\n\u003Ch2>Le vrai coût d'une vérification manquée\u003C/h2>\n\u003Cp>Chaque point de cette checklist semble individuellemement simple. Le danger d'une refonte, c'est l'accumulation : un \u003Ccode>noindex\u003C/code> oublié ici, 200 redirections manquantes là, un maillage interne appauvri, des canonicals qui pointent vers le staging. Chaque défaut pris isolément est mineur. Combinés, ils provoquent l'effondrement du trafic organique.\u003C/p>\n\u003Cp>La clé : automatiser tout ce qui peut l'être (redirections, tests de régression, monitoring), et réserver le temps humain aux décisions qui nécessitent du jugement (mapping sémantique, arbitrages d'architecture, priorisation des pages). Intégrez vos vérifications SEO dans le pipeline CI/CD, crawlez votre staging aussi souvent que votre production, et mettez en place un monitoring différentiel permanent post-migration. C'est la seule façon de transformer une refonte d'un risque SEO en opportunité.\u003C/p>\n\u003Cpre>\u003Ccode>\u003C/code>\u003C/pre>",null,14,[18,19,20,21],"refonte","migration","checklist","seo","Refonte de site : 20 vérifications SEO indispensables","Thu Apr 09 2026 23:32:58 GMT+0000 (Coordinated Universal Time)",[25,36],{"_id":26,"slug":27,"__v":6,"author":7,"canonical":28,"category":10,"createdAt":29,"date":12,"description":30,"image":15,"imageAlt":15,"readingTime":16,"tags":31,"title":34,"updatedAt":35},"69d7e9c3aa6b273b0c95cc57","migration-http-vers-https-checklist-seo-complete","https://seogard.io/blog/migration-http-vers-https-checklist-seo-complete","2026-04-09T18:02:43.120Z","Checklist technique pour migrer de HTTP à HTTPS sans perdre de trafic organique. Redirections, HSTS, Search Console, mixed content.",[32,19,33,21],"https","redirections","Migration HTTP vers HTTPS : checklist SEO complète","Thu Apr 09 2026 18:02:43 GMT+0000 (Coordinated Universal Time)",{"_id":37,"slug":38,"__v":6,"author":7,"canonical":39,"category":10,"createdAt":40,"date":12,"description":41,"image":15,"imageAlt":15,"readingTime":16,"tags":42,"title":46,"updatedAt":47},"69d83cc6aa6b273b0cd8286f","changer-de-framework-next-js-vers-nuxt-ou-l-inverse-sans-perte-seo","https://seogard.io/blog/changer-de-framework-next-js-vers-nuxt-ou-l-inverse-sans-perte-seo","2026-04-09T23:56:54.564Z","Guide technique complet pour migrer entre Next.js et Nuxt sans perdre de trafic organique : redirections, SSR, sitemap, monitoring et cas concret.",[19,43,44,45,21],"nextjs","nuxt","framework","Migration Next.js vers Nuxt (ou l'inverse) sans perte SEO","Thu Apr 09 2026 23:56:54 GMT+0000 (Coordinated Universal Time)"]