Technical SEO Audit Checklist: 100-Point Guide

Complete 100-point technical SEO audit checklist covering crawlability, Core Web Vitals, structured data, international SEO, indexation, and site architecture for 2026.

E
ECOSIRE Research and Development Team
|19 mars 202612 min de lecture2.7k Mots|

Liste de contrôle d'audit technique SEO : guide en 100 points

Un audit technique de référencement ne concerne pas les balises méta et la densité des mots clés : il s'agit d'un examen technique systématique de la qualité de la communication de votre site avec les moteurs de recherche. L'exploration, l'indexation, les Core Web Vitals, les données structurées, la canonisation et les signaux internationaux affectent tous votre classement avant qu'un seul élément de contenu ne soit évalué. En 2026, alors que les moteurs de recherche basés sur l’IA et l’AEO (Answer Engine Optimization) deviennent aussi importants que le référencement traditionnel, la base technique compte plus que jamais.

Cette liste de contrôle en 100 points est organisée par catégorie. Parcourez-le systématiquement et suivez les résultats dans une feuille de calcul. Corrigez les éléments critiques (marqués C) avant tout autre travail d’optimisation – ils peuvent empêcher le reste d’avoir un effet.

Points clés à retenir

  • L'exploration est la première porte : si Googlebot ne peut pas accéder à vos pages, rien d'autre n'a d'importance
  • Core Web Vitals (LCP, INP, CLS) sont des signaux de classement confirmés ; cible LCP < 2,5 s, INP < 200 ms, CLS < 0,1
  • Les balises canoniques empêchent la dilution du contenu en double - chaque page a besoin d'une pointant vers elle-même
  • hreflang est obligatoire pour les sites multilingues ; x-default doit être défini pour chaque groupe d'URL
  • Les données structurées (JSON-LD) permettent des résultats riches et sont essentielles pour l'attribution des sources AI/LLM
  • Le HTTPS est un enjeu de table en 2026 ; le contenu mixte bloque l'indexation des pages concernées
  • L'indexation axée sur le mobile signifie que votre expérience mobile est ce que Google évalue
  • Les liens internes avec un texte d'ancrage descriptif distribuent le PageRank et signalent la pertinence du sujet

Section 1 : Crawlabilité et indexation (C = Critique)

robots.txt

  • (C) robots.txt est accessible à /robots.txt et renvoie 200
  • (C) URL du plan du site déclarée : Sitemap: https://example.com/sitemap.xml -[ ] Les pages clés ne sont pas accidentellement bloquées par Disallow
  • Directives de taux d'exploration séparées pour les robots agressifs
  • Les robots d'exploration IA explicitement autorisés ou interdits par politique (GPTBot, ClaudeBot, OAI-SearchBot)
User-agent: *
Allow: /
Disallow: /admin/
Disallow: /api/
Disallow: /auth/
Sitemap: https://ecosire.com/sitemap.xml

# Allow AI indexers
User-agent: GPTBot
Allow: /
User-agent: ClaudeBot
Allow: /

Plan du site XML

  • (C) Le plan du site renvoie 200 avec le Content-Type: application/xml correct
  • (C) Toutes les URL canoniques incluses ; aucune URL bloquée par robots.txt ou noindex
  • Les dates <lastmod> sont exactes (pas toutes les mêmes dates statiques)
  • <priority> et <changefreq> définis de manière appropriée par type de page -[ ] Plan du site divisé en index + sous-sitemaps pour les sites avec plus de 50 000 URL
  • Plan du site soumis à Google Search Console et Bing Webmaster Tools
  • Plan du site avec images inclus pour les pages contenant beaucoup d'images
  • URL de langues alternatives dans le plan du site (hreflang)
// Next.js sitemap.ts — programmatic with correct lastmod
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
  const posts = await getAllBlogPosts();
  return [
    {
      url: 'https://ecosire.com',
      lastModified: new Date(),
      changeFrequency: 'daily',
      priority: 1.0,
    },
    ...posts.map((post) => ({
      url: `https://ecosire.com/blog/${post.slug}`,
      lastModified: new Date(post.updatedAt),
      changeFrequency: 'weekly' as const,
      priority: 0.8,
    })),
  ];
}

Budget d'exploration

  • Les pages de pagination utilisent rel="next" / rel="prev" (ou défilement infini avec SSR)
  • Les URL de navigation à facettes sont soit canonisées, soit non indexées.
  • ID de session et paramètres de suivi exclus des URL indexées
  • Chaînes de redirection limitées à un saut (A vers B, pas A vers B vers C)
  • Pas de soft 404 — 404 pages renvoient HTTP 404, pas 200

Section 2 : HTTPS et sécurité

  • (C) Toutes les pages servies via HTTPS avec un certificat valide
  • (C) Redirection HTTP vers HTTPS (301, pas 302)
  • (C) Aucun avertissement de contenu mixte (ressources HTTP sur les pages HTTPS) -[ ] HSTS activé avec max-age=31536000; includeSubDomains; preload
  • Il reste plus de 90 jours au certificat SSL
  • Le certificat couvre les variantes www et non-www
  • Chaîne de certificats complète (aucune autorité de certification intermédiaire manquante)
# Nginx HTTPS configuration
server {
    listen 443 ssl http2;
    server_name ecosire.com;

    ssl_certificate     /etc/letsencrypt/live/ecosire.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ecosire.com/privkey.pem;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
}

Section 3 : Éléments essentiels du Web

Largest Contentful Paint (LCP) — Cible : moins de 2,5 s

-[ ] (C) Élément LCP identifié dans CrUX/PageSpeed Insights

  • Image/vidéo de héros préchargée avec <link rel="preload" as="image"> -[ ] Image LCP diffusée avec l'attribut fetchpriority="high" correct -[ ] Images au format WebP ou AVIF, et non PNG/JPEG si possible
  • Images dimensionnées de manière appropriée (aucune image de 4 000 px affichée à 800 px)
  • CDN servant des actifs statiques avec mise en cache périphérique
  • Serveur TTFB sous 800 ms (réduit la fenêtre LCP)
// Next.js: priority prop preloads the hero image
<Image
  src="/hero.webp"
  alt="Hero image"
  width={1200}
  height={630}
  priority
  sizes="100vw"
/>

Interaction avec Next Paint (INP) – Cible : moins de 200 ms

  • Tâches longues (plus de 50 ms) identifiées et découpées
  • JavaScript lourd différé ou chargé paresseux -[ ] Les gestionnaires d'événements sont efficaces et ne provoquent pas de recalculs de mise en page -[ ] Scripts tiers chargés avec async ou defer

Cumulative Layout Shift (CLS) — Cible : inférieure à 0,1

  • (C) Toutes les images et vidéos ont des attributs explicites width et height
  • Les polices Web utilisent font-display: optional ou swap avec ajustement de la taille
  • Les espaces publicitaires ont des dimensions réservées -[ ] Contenu injecté dynamiquement au-dessus de la ligne de flottaison évité
  • Les animations utilisent uniquement transform et opacity (pas top, left, width)

Section 4 : Structure des URL et canonisation

  • (C) Chaque page a une balise canonique auto-référencée
  • (C) L'URL de la balise canonique correspond à l'URL réellement servie (barre oblique finale cohérente)
  • redirection www et non-www vers la version canonique - [ ] Les URL sont en minuscules, avec des traits d'union comme séparateurs de mots, sans traits de soulignement.
  • Profondeur de l'URL au maximum à 4 niveaux à partir de la racine pour les pages importantes
  • Aucun paramètre d'URL créant du contenu en double sans canonisation
  • Les séries paginées sont canonisées jusqu'à la première page (ou chaque page auto-canonique)
// Next.js generateMetadata with canonical
export async function generateMetadata({ params }: Props): Promise<Metadata> {
  const { locale, slug } = await params;
  const base = locale === 'en' ? '' : `/${locale}`;
  const canonicalUrl = `https://ecosire.com${base}/blog/${slug}`;

  return {
    alternates: {
      canonical: canonicalUrl,
      languages: buildHreflangUrls(slug), // all 11 locales
    },
  };
}

Section 5 : Métadonnées et référencement sur la page

  • (C) Chaque page a une balise <title> unique (50-60 caractères)
  • (C) Chaque page a un <meta name="description"> unique (150-160 caractères)
  • Les titres suivent le modèle : Primary Keyword | Brand Name
  • Aucune balise de titre en double sur le site
  • Balises Open Graph : og:title, og:description, og:image, og:url, og:type
  • Balises de la carte Twitter/X : twitter:card, twitter:title, twitter:image -[ ] Les images OG font 1 200 x 630 px, moins de 8 Mo, diffusées à partir du CDN.
  • <meta name="robots"> utilisé uniquement pour restreindre (non redondant index,follow)
  • <html lang="en"> défini correctement pour toutes les pages

Section 6 : Données structurées (JSON-LD)

  • (C) JSON-LD préféré à Microdata/RDFa (plus facile à maintenir, convivial pour l'analyseur)
  • Schéma d'organisation sur la page d'accueil avec les URL de profil social sameAs
  • Schéma du site Web avec SearchAction pour la zone de recherche des liens annexes
  • Schéma BreadcrumbList sur toutes les pages sous la page d'accueil
  • Schéma d'article sur les articles de blog avec datePublished, dateModified, author
  • Schéma FAQPage sur les pages avec des sections FAQ
  • Schéma du produit sur les pages produits avec offers, aggregateRating
  • Schéma de service sur les pages de service avec areaServed, serviceType
  • Propriété inLanguage sur tous les schémas pour l'attribution d'IA multilingue -[ ] Données structurées validées dans le test Rich Results de Google
// JSON-LD with XSS protection
// The .replace() encodes the less-than sign to prevent </script> breakout,
// making this safe for use in a script tag (no untrusted HTML rendered)
export function JsonLd({ data }: { data: Record<string, unknown> }) {
  const safeJson = JSON.stringify(data).replace(/</g, '\\u003c');

  return (
    <script
      type="application/ld+json"
      // Safe: safeJson is a sanitized JSON string, not HTML
      dangerouslySetInnerHTML={{ __html: safeJson }}
    />
  );
}

// Usage
const schema = {
  '@context': 'https://schema.org',
  '@type': 'FAQPage',
  inLanguage: locale,
  mainEntity: faqs.map((faq) => ({
    '@type': 'Question',
    name: faq.question,
    acceptedAnswer: { '@type': 'Answer', text: faq.answer },
  })),
};

<JsonLd data={schema} />

Section 7 : Référencement international

  • (C) balises hreflang sur toutes les pages avec variantes linguistiques
  • (C) x-default hreflang défini pour chaque groupe d'URL
  • les attributs hreflang sont bidirectionnels (si /en/ est lié à /fr/, /fr/ doit renvoyer à /en/) -[ ] Les URL de paramètres régionaux utilisent les codes de langue ISO 639-1 + les codes de région ISO 3166-1 si nécessaire
  • <html lang="xx"> correspond aux paramètres régionaux hreflang de cette page
  • Les langues RTL (arabe, hébreu, ourdou) utilisent dir="rtl" sur <html>
  • Le contenu est traduit, pas seulement traduit automatiquement sans révision
  • Ciblage géographique défini dans Google Search Console par sous-répertoire de paramètres régionaux
// Next.js hreflang via generateMetadata
const locales = ['en', 'zh', 'es', 'ar', 'pt', 'fr', 'de', 'ja', 'tr', 'hi', 'ur'];

// In generateMetadata:
// alternates.languages keys must be BCP 47 language tags
alternates: {
  languages: Object.fromEntries([
    ['x-default', `https://ecosire.com/blog/${slug}`],
    ['en',        `https://ecosire.com/blog/${slug}`],
    ['zh',        `https://ecosire.com/zh/blog/${slug}`],
    ['ar',        `https://ecosire.com/ar/blog/${slug}`],
    // ... all 11 locales
  ]),
},

Section 8 : Performances et infrastructure

  • Actifs statiques servis depuis CDN (CloudFront, Cloudflare, Fastly)
  • Mise en cache du navigateur : Cache-Control: public, max-age=31536000, immutable pour les actifs hachés
  • Compression Gzip ou Brotli activée sur le serveur
  • HTTP/2 ou HTTP/3 activé
  • DNS TTL 3 600 ou moins pour un basculement agile
  • Temps de réponse du serveur inférieur à 200 ms pour HTML (mesure TTFB)
  • Bundle JavaScript de moins de 250 Ko de charge initiale (gzippé)
  • JavaScript inutilisé éliminé (tree-shaking, code splitting)
  • CSS purgé des règles inutilisées en production
# Nginx compression + caching headers
gzip on;
gzip_types text/html text/css application/javascript application/json image/svg+xml;
gzip_min_length 1024;

location /_next/static/ {
    expires max;
    add_header Cache-Control "public, max-age=31536000, immutable";
}

Section 9 : Expérience mobile et utilisateur

  • (C) Balise méta de la fenêtre : <meta name="viewport" content="width=device-width, initial-scale=1"> -[ ] Tous les éléments interactifs ont des cibles tactiles d'au moins 48x48px
  • Pas de défilement horizontal sur mobile (largeur maximale : 100 vw)
  • Taille de police d'au moins 16 px pour le corps du texte (empêche le zoom automatique iOS sur le focus d'entrée)
  • Navigation mobile testée sur des appareils réels (iOS Safari, Chrome Android)
  • Les pop-ups et les interstitiels ne couvrent pas le contenu principal sur mobile
  • Appuyez pour appeler sur des numéros de téléphone pour les visiteurs mobiles

Section 10 : AEO (Optimisation du moteur de réponse)

De plus en plus important pour les moteurs de recherche IA et les assistants vocaux :

  • Réponses clés enveloppées dans l'attribut data-speakable
  • <details>/<summary> utilisé pour le contenu de la FAQ pliable (explorable, sémantique) -[ ] /llms.txt et /.well-known/llms.txt publiés pour les robots d'exploration IA
  • Paragraphes de réponses concis et factuels en haut des sections clés (optimisation des extraits de code)
  • Relations d'entité claires dans les données structurées (Organisation vers Services vers Produits)
  • Nom de marque cohérent sur toutes les pages, profils sociaux et répertoires
  • API IndexNow utilisée pour la soumission instantanée d'URL après la publication d'un nouveau contenu

Questions fréquemment posées

À quelle fréquence dois-je effectuer un audit technique de référencement ?

Exécutez un audit complet tous les trimestres et une analyse légère (Screaming Frog ou Sitebulb) mensuellement. Tout changement important sur le site (nouvelle pile technologique, migration, ajout de contenu international, refonte majeure) justifie un audit immédiat. Configurez une surveillance continue via les alertes de Google Search Console en cas de baisse soudaine des pages indexées ou d'erreurs d'exploration.

De quels outils ai-je besoin pour un audit technique de référencement ?

Au minimum : Google Search Console (gratuit, canonique), Screaming Frog ou Sitebulb (analyse d'exploration), PageSpeed ​​​​Insights (Core Web Vitals), Google Rich Results Test (données structurées), WebAIM Contrast Checker (accessibilité/UX) et Ahrefs ou Semrush (backlinks, classement des mots clés). Pour les sites utilisant beaucoup de JavaScript, ajoutez Rendertron ou Botify pour l'exploration du rendu.

Quel est le problème SEO critique le plus fréquemment rencontré lors des audits ?

Les mauvaises configurations des balises canoniques sont le résultat critique le plus courant : soit elles sont entièrement manquantes, pointent vers la mauvaise URL (souvent un domaine de développement ou de préparation laissé en production), soit elles sont incompatibles avec l'utilisation d'une barre oblique finale. La deuxième plus courante concerne les directives noindex accidentelles provenant des plugins CMS ou des configurations intermédiaires laissées dans les versions de production.

Next.js App Router facilite-t-il le référencement technique ?

Oui, de manière significative. Le rendu côté serveur signifie que tout le contenu se trouve dans la réponse HTML initiale (aucun JavaScript n'est requis pour l'exploration). Les métadonnées generateMetadata() par page évitent les erreurs de métadonnées statiques globales. Les conventions sitemap.ts et robots.ts facilitent la maintenance de ces fichiers par programme. Le composant Image intégré applique la largeur et la hauteur pour la prévention CLS et génère automatiquement des variantes WebP/AVIF.

Comment gérer le référencement pour le contenu paginé ?

Pour les archives de blog paginées ou les listes de produits, chaque page doit avoir un canonique auto-référencé (et non canonique à la page 1), un titre descriptif indiquant le numéro de page, et si le contenu est substantiel, autoriser l'indexation. Pour les pages à pagination fine, envisagez de noindex sur les pages au-delà de la page 3. Google a rendu obsolète rel="next"/rel="prev" en 2019, mais il est toujours utilisé par d'autres moteurs de recherche.


Prochaines étapes

Un audit technique SEO est un investissement ponctuel qui multiplie le retour sur investissement de tout votre travail de contenu et de marketing. Les 100 points de cette liste de contrôle couvrent toute l’étendue de ce que les moteurs de recherche évaluent avant de classer votre contenu.

ECOSIRE met en œuvre les meilleures pratiques techniques de référencement dans le cadre de chaque projet Next.js – des plans de site programmatiques et hreflang pour 11 paramètres régionaux aux données structurées, à l'optimisation Core Web Vitals et à l'intégration de l'API IndexNow. Découvrez nos services de développement Web pour découvrir comment nous créons une visibilité dans les recherches dès le premier jour.

E

Rédigé par

ECOSIRE Research and Development Team

Création de produits numériques de niveau entreprise chez ECOSIRE. Partage d'analyses sur les intégrations Odoo, l'automatisation e-commerce et les solutions d'entreprise propulsées par l'IA.

Discutez sur WhatsApp