Bonnes pratiques — Sitemap XML
Table des matières
- Qu'est-ce qu'un sitemap ?
- Types de sitemaps
- Structure et syntaxe
- Limites et contraintes techniques
- Quelles URLs inclure ?
- Les attributs XML
- Sitemap index
- Déclaration et soumission
- Sitemaps spécialisés
- Erreurs courantes à éviter
- Automatisation et maintenance
- Validation
Qu'est-ce qu'un sitemap ?
Un sitemap (ou plan du site) est un fichier XML qui liste les URLs d'un site web afin d'aider les moteurs de recherche à les découvrir et à les explorer plus efficacement. Il ne garantit pas l'indexation d'une page, mais améliore la communication entre le site et les crawlers.
Analogie : Le sitemap est comme une table des matières que tu remets au moteur de recherche pour lui dire : « Voici toutes les pages de mon site, et voici leur importance relative. »
Quand un sitemap est-il particulièrement utile ?
- Sites de grande taille (des centaines ou milliers de pages)
- Sites dont le maillage interne est faible ou peu structuré
- Sites récents avec peu de backlinks externes
- Sites avec du contenu riche en médias (images, vidéos)
- Sites avec des pages mises à jour très fréquemment
Types de sitemaps
| Type | Format | Usage principal |
|---|---|---|
| Sitemap XML | .xml |
Pages web standard |
| Sitemap d'images | .xml (extension) |
Images indexables |
| Sitemap de vidéos | .xml (extension) |
Contenu vidéo |
| Sitemap d'actualités | .xml (extension) |
Articles de presse (Google News) |
| Sitemap texte | .txt |
Liste d'URLs simples (usage limité) |
| Sitemap RSS/Atom | .xml |
Flux de contenu (blogs, podcasts) |
Structure et syntaxe
Exemple minimal valide
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://example.com/</loc>
</url>
<url>
<loc>https://example.com/a-propos</loc>
</url>
</urlset>
Exemple complet avec tous les attributs
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://example.com/page</loc>
<lastmod>2024-11-15</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
</urlset>
Règles de formatage
- L'encodage doit être UTF-8
- Toutes les URLs doivent utiliser le protocole complet (
https://ouhttp://) - Les caractères spéciaux doivent être échappés en entités XML :
| Caractère | Entité XML |
|---|---|
& |
& |
' |
' |
" |
" |
> |
> |
< |
< |
Limites et contraintes techniques
| Contrainte | Valeur maximale |
|---|---|
| Nombre d'URLs par fichier | 50 000 |
| Taille d'un fichier | 50 MB non compressé |
Taille compressée (.xml.gz) |
Acceptée par tous les moteurs |
Si l'un de ces seuils est atteint, il faut utiliser un sitemap index (voir section dédiée).
Compression recommandée
Il est conseillé de compresser les sitemaps volumineux en .gz pour réduire la bande passante et accélérer l'exploration :
sitemap.xml.gz
Quelles URLs inclure ?
✅ À inclure
- Pages canoniques (la version définitive d'une URL)
- Pages accessibles sans authentification
- Pages retournant un statut HTTP
200 - Pages dont on souhaite l'indexation
- Pages avec du contenu de valeur pour les utilisateurs
❌ À exclure
- Pages en redirection (
301,302) - Pages avec une balise
<meta name="robots" content="noindex"> - Pages bloquées dans
robots.txt - Pages de résultats de recherche interne
- Pages d'administration, de connexion, de panier
- Pages de pagination (sauf la page 1 selon les cas)
- URLs avec paramètres de session ou de tracking (
?sessionid=,?utm_source=) - Pages dupliquées (ne garder que la canonique)
- Pages retournant une erreur (
404,410,500)
Règle d'or : Ne soumettre que les URLs que tu veux voir indexées et qui correspondent à la version canonique.
Les attributs XML
<loc> (obligatoire)
L'URL complète et absolue de la page.
<loc>https://example.com/ma-page</loc>
- Doit correspondre exactement au protocole utilisé (
httpsde préférence) - Doit être la version canonique de l'URL (avec ou sans slash final, de façon cohérente)
<lastmod> (optionnel)
Date de dernière modification du contenu, au format W3C Datetime (YYYY-MM-DD ou complet YYYY-MM-DDTHH:MM:SS+00:00).
<lastmod>2024-11-15</lastmod>
Bonnes pratiques :
- N'utiliser
lastmodque si la date est réelle et fiable (générée dynamiquement depuis la base de données) - Ne pas mettre la date du jour sur toutes les pages statiquement — Google ignore les dates incorrectes ou trop fréquemment mises à jour
<changefreq> (optionnel)
Fréquence estimée de modification du contenu. Valeurs possibles :
| Valeur | Usage typique |
|---|---|
always |
Pages modifiées à chaque visite |
hourly |
Flux en temps réel |
daily |
Actualités, blogs actifs |
weekly |
Contenu mis à jour régulièrement |
monthly |
Pages de contenu stable |
yearly |
Pages quasi-statiques |
never |
Archives permanentes |
Note importante : Google indique officiellement qu'il utilise peu cet attribut. Il reste utile comme indication, mais ne constitue pas une directive.
<priority> (optionnel)
Priorité relative de la page dans le site, entre 0.0 et 1.0 (défaut : 0.5).
<priority>0.8</priority>
Recommandations :
- Page d'accueil :
1.0 - Pages principales de catégories :
0.8 - Pages de contenu standard :
0.5à0.7 - Pages secondaires :
0.3à0.5
Attention : La priorité est relative au site, pas aux autres sites. Mettre
1.0partout n'a aucun effet positif et dilue l'information.
Sitemap index
Quand un site dépasse 50 000 URLs ou que le fichier dépasse 50 MB, il faut diviser les sitemaps et créer un fichier index.
Structure d'un sitemap index
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>https://example.com/sitemap-pages.xml</loc>
<lastmod>2024-11-15</lastmod>
</sitemap>
<sitemap>
<loc>https://example.com/sitemap-articles.xml</loc>
<lastmod>2024-11-14</lastmod>
</sitemap>
<sitemap>
<loc>https://example.com/sitemap-images.xml</loc>
<lastmod>2024-11-10</lastmod>
</sitemap>
</sitemapindex>
Bonnes pratiques pour le sitemap index
- Placer le fichier index à la racine :
https://example.com/sitemap.xml - Référencer uniquement des sitemaps du même domaine
- Mettre à jour le
<lastmod>du sitemap index lorsqu'un sous-sitemap change - Segmenter logiquement : par type de contenu, par langue, par section
Déclaration et soumission
1. Dans robots.txt (recommandé)
Ajouter à la fin du fichier robots.txt :
Sitemap: https://example.com/sitemap.xml
Plusieurs sitemaps peuvent être déclarés :
Sitemap: https://example.com/sitemap.xml
Sitemap: https://example.com/sitemap-images.xml
2. Via Google Search Console
- Aller dans Index > Sitemaps
- Soumettre l'URL complète du sitemap
- Permet de surveiller les erreurs et le statut d'indexation
3. Via Bing Webmaster Tools
- Aller dans Sitemaps
- Soumettre l'URL du sitemap
4. Ping HTTP (déprécié)
Google a retiré l'endpoint de ping en 2023. Cette méthode n'est plus fonctionnelle.
Stratégie recommandée : Déclarer dans
robots.txt+ soumettre dans Search Console + soumettre dans Bing Webmaster Tools.
Sitemaps spécialisés
Sitemap d'images
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
<url>
<loc>https://example.com/ma-page</loc>
<image:image>
<image:loc>https://example.com/images/photo.jpg</image:loc>
<image:title>Description de l'image</image:title>
<image:caption>Légende de l'image</image:caption>
</image:image>
</url>
</urlset>
Sitemap de vidéos
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
<url>
<loc>https://example.com/ma-video</loc>
<video:video>
<video:thumbnail_loc>https://example.com/thumb.jpg</video:thumbnail_loc>
<video:title>Titre de la vidéo</video:title>
<video:description>Description de la vidéo</video:description>
<video:content_loc>https://example.com/video.mp4</video:content_loc>
<video:duration>600</video:duration>
<video:publication_date>2024-11-15T08:00:00+00:00</video:publication_date>
</video:video>
</url>
</urlset>
Sitemap d'actualités (Google News)
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:news="http://www.google.com/schemas/sitemap-news/0.9">
<url>
<loc>https://example.com/article/mon-titre</loc>
<news:news>
<news:publication>
<news:name>Nom du média</news:name>
<news:language>fr</news:language>
</news:publication>
<news:publication_date>2024-11-15T09:00:00+00:00</news:publication_date>
<news:title>Titre de l'article</news:title>
</news:news>
</url>
</urlset>
Les sitemaps Google News ne doivent contenir que des articles publiés dans les 48 dernières heures.
Sitemap multilingue (hreflang)
<url>
<loc>https://example.com/fr/page</loc>
<xhtml:link rel="alternate" hreflang="fr" href="https://example.com/fr/page"/>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/page"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/en/page"/>
</url>
Namespace requis : xmlns:xhtml="http://www.w3.org/1999/xhtml"
Erreurs courantes à éviter
| Erreur | Impact | Solution |
|---|---|---|
Inclure des URLs noindex |
Incohérence signalée dans Search Console | Exclure les pages bloquées |
| Inclure des redirections | Perte de budget crawl | Ne mettre que les URL finales |
| URLs non canoniques | Signaux SEO dilués | Utiliser uniquement la version canonique |
lastmod non fiable (toujours aujourd'hui) |
Google ignore l'attribut | Générer dynamiquement depuis la BDD |
| Oublier le HTTPS si disponible | Confusion de protocole | Utiliser le protocole par défaut du site |
Incohérence avec robots.txt |
Pages soumises mais bloquées | Vérifier que les URLs ne sont pas bloquées |
| Omettre le sitemap index sur grand site | Dépasser la limite de 50 000 URLs | Implémenter un index segmenté |
| Ne jamais mettre à jour le sitemap | Nouvelles pages non découvertes | Automatiser la génération |
| Mélanger HTTP et HTTPS | Duplication de contenu | Cohérence absolue de protocole |
Automatisation et maintenance
CMS populaires
| CMS | Plugin/Module recommandé |
|---|---|
| WordPress | Yoast SEO, Rank Math, Google XML Sitemaps |
| Joomla | OSMap, Xmap |
| Drupal | Simple XML Sitemap |
| Magento | Intégré nativement |
| Shopify | Intégré nativement (/sitemap.xml) |
Génération programmatique (PHP)
<?php
header('Content-Type: application/xml; charset=utf-8');
echo '<?xml version="1.0" encoding="UTF-8"?>';
?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<?php foreach ($pages as $page): ?>
<url>
<loc><?= htmlspecialchars($page['url']) ?></loc>
<lastmod><?= date('Y-m-d', strtotime($page['updated_at'])) ?></lastmod>
<changefreq>weekly</changefreq>
<priority><?= $page['priority'] ?></priority>
</url>
<?php endforeach; ?>
</urlset>
Fréquence de mise à jour recommandée
- Sites à contenu dynamique (e-commerce, blogs) : régénération automatique à chaque publication
- Sites statiques : régénération à chaque déploiement
- Notification aux moteurs : soumettre un ping via Search Console après modification majeure
Validation
Outils en ligne
- Google Search Console — Outil de test et de soumission officiel
- Screaming Frog SEO Spider — Audit complet et détection d'erreurs
- XML Sitemap Validator — xmlsitemaps.com
- Bing Webmaster Tools — Validation et soumission pour Bing
Vérifications manuelles essentielles
# Vérifier l'accessibilité du sitemap
curl -I https://example.com/sitemap.xml
# Vérifier le Content-Type retourné (doit être application/xml ou text/xml)
curl -s -D - https://example.com/sitemap.xml -o /dev/null | grep content-type
# Valider la syntaxe XML
xmllint --noout sitemap.xml
Checklist de validation
- [ ] Le fichier est accessible publiquement (HTTP 200)
- [ ] Le Content-Type est
application/xmloutext/xml - [ ] Le XML est valide (pas d'erreurs de syntaxe)
- [ ] Toutes les URLs retournent HTTP 200
- [ ] Aucune URL
noindexn'est incluse - [ ] Aucune URL bloquée par
robots.txtn'est incluse - [ ] Le sitemap est déclaré dans
robots.txt - [ ] Le sitemap est soumis dans Search Console
- [ ] Les dates
lastmodsont fiables et à jour - [ ] Les URLs utilisent le bon protocole (HTTPS)