- Gestionnaire de redirections
- Administration des redirections
- 301 vs 302 : quand utiliser lequel ?
- Cas d'usage courants
- Refonte de site et changement de structure d'URL
- Normalisation des URLs avec et sans slash final
- Pages supprimées → page de remplacement
- Migration de domaine
- Fil d'Ariane automatique
- Structure selon le type de contenu
- Séparateur configurable
- Données structurées du fil d'Ariane
- Bloc JSON-LD complémentaire
- Intégration dans le thème
- Redirections et fil d'Ariane : synergie SEO
Gestionnaire de redirections
La classe RedirectManager gère les redirections HTTP stockées dans le fichier content/redirects.json. Chaque redirection est vérifiée avant le routage principal — si l'URL demandée correspond à une source connue, la réponse HTTP est émise immédiatement et le routeur normal ne s'exécute pas. Cette interception précoce garantit un temps de réponse minimal et évite tout chargement inutile du contenu.
Côté implémentation, RedirectManager::init() charge le fichier JSON une seule fois par requête. La vérification parcourt le tableau des règles dans l'ordre de déclaration : la première correspondance trouvée déclenche la redirection, les règles suivantes ne sont pas évaluées. Cet ordre de priorité est important lorsque plusieurs règles pourraient potentiellement s'appliquer à la même URL source.
Administration des redirections
L'interface se trouve dans Admin → SEO → Redirections. Pour chaque règle, vous renseignez :
- URL source — chemin relatif avec slash initial, ex.
/ancienne-page/. La correspondance est exacte :/ancienne-page/ne redirige pas/ancienne-pagesans slash final, ni les sous-chemins comme/ancienne-page/sous-page/. - URL cible — chemin relatif (
/nouvelle-page/) ou URL absolue complète (https://autre-domaine.com/page/). Les URLs absolues permettent la migration de domaine. - Type —
301(permanente) ou302(temporaire). Ce choix a un impact direct sur le référencement.
Le format de stockage est un tableau JSON simple, éditable manuellement si nécessaire :
[
{
"source": "/ancienne-page/",
"target": "/nouvelle-page/",
"type": 301
},
{
"source": "/promo-ete/",
"target": "/promotions/",
"type": 302
},
{
"source": "/old-blog/post-name/",
"target": "https://nouveau-site.fr/blog/post-name/",
"type": 301
}
]
301 vs 302 : quand utiliser lequel ?
Le choix entre 301 et 302 est l'une des décisions les plus importantes en SEO. Une erreur fréquente consiste à utiliser 302 par défaut « pour être prudent » — c'est en réalité contre-productif dans la majorité des cas.
- 301 — Permanente : la page a définitivement changé d'URL. Google transfère le PageRank accumulé (les « link juice ») vers la nouvelle URL. Utilisez 301 lors d'une refonte de site, d'un changement de slug, d'une migration de domaine, ou de la suppression définitive d'une page vers une alternative pertinente. Une fois mise en cache par les moteurs, la 301 met plusieurs semaines à se propager complètement.
- 302 — Temporaire : la page est provisoirement déplacée. Google conserve l'URL originale dans son index et n'y transfère pas le PageRank. Adapté à la maintenance planifiée, aux tests A/B d'une page de destination, aux contenus saisonniers (vente flash, landing page événementielle) ou aux situations où vous n'êtes pas encore certain que le changement est définitif.
En pratique : en cas de doute, préférez la 301. Si vous utilisez une 302 pendant plus de quelques semaines, Google risque de l'interpréter comme une 301 de fait et de mettre à jour son index en conséquence.
Le mécanisme d'envoi de la réponse est délibérément minimal — pas de mise en tampon, pas de rendu de template :
http_response_code($redirect['type']); // 301 ou 302
header('Location: ' . $redirect['target']);
exit; // arrêt immédiat — aucune ressource supplémentaire chargée
Cas d'usage courants
Refonte de site et changement de structure d'URL
Lors d'une migration vers QuietCMS depuis un CMS tiers (WordPress, Drupal, SPIP…), les URLs historiques de l'ancien site doivent être redirigées vers leurs équivalents sur le nouveau site. Exporter les anciennes URLs depuis votre outil d'analyse (Google Search Console, analytics) et créer une règle 301 par ancienne URL préserve le positionnement SEO accumulé. Une règle 301 bien configurée fait en sorte que Google ne détecte pas de « page disparue » (erreur 404) mais une « page déplacée ».
Normalisation des URLs avec et sans slash final
Si votre site a historiquement servi des URLs sans slash final (/contact) et que la nouvelle convention inclut le slash (/contact/), créez des redirections 301 systématiques. Évite le contenu dupliqué que Google pourrait pénaliser ou qui diluerait les signaux de popularité entre deux versions de la même page.
Pages supprimées → page de remplacement
Plutôt qu'une erreur 404 nue, redirigez les pages supprimées vers la page de catégorie parente, la page d'accueil, ou vers le contenu le plus proche sémantiquement. Cela améliore l'expérience utilisateur et transfère partiellement la valeur SEO de l'ancienne page.
Migration de domaine
Pour une migration complète de ancien-domaine.fr vers nouveau-domaine.fr, chaque URL de l'ancien domaine doit être redirigée vers son équivalent exact sur le nouveau. Les redirections doivent rester actives au minimum 6 à 12 mois pour que Google traite complètement la migration.
Fil d'Ariane automatique
La classe BreadcrumbBuilder génère le fil d'Ariane (breadcrumb) adapté au type de contenu affiché. Il s'agit d'un élément de navigation secondaire qui indique à l'utilisateur sa position dans l'arborescence du site, et qui permet aux moteurs de recherche de comprendre la structure hiérarchique du contenu.
Il est disponible dans les templates de thème via l'appel :
<?php echo BreadcrumbBuilder::render($settings, $page, $template); ?>
Structure selon le type de contenu
BreadcrumbBuilder détecte automatiquement le type de template en cours et génère la hiérarchie appropriée :
- Page statique sans parent : Accueil › Page courante
- Page statique avec parent : Accueil › Page parente › Page courante (les niveaux d'imbrication sont illimités)
- Article de blog : Accueil › Blog › Catégorie › Titre de l'article
- Page de catégorie : Accueil › Blog › Nom de la catégorie
- Page d'accueil du blog : Accueil › Blog
Le lien « Accueil » pointe toujours vers BASE_URL. Le lien « Blog » pointe vers l'URL configurée dans le réglage blog_slug. Les liens de catégorie utilisent le préfixe blog_cat_prefix défini dans les paramètres.
Séparateur configurable
Le séparateur affiché entre les niveaux est configurable dans les réglages du thème (défaut : ›). D'autres séparateurs courants : /, >, →, •. Le séparateur est rendu en HTML et peut donc contenir des entités HTML ou des caractères Unicode.
Données structurées du fil d'Ariane
Le HTML généré par BreadcrumbBuilder embarque deux couches de données structurées complémentaires :
- Microdata Schema.org — directement dans les attributs HTML (
itemscope,itemprop) - JSON-LD BreadcrumbList — injecté dans le
<head>si l'option est activée dans les réglages
Ces deux formats sont reconnus par Google, Bing et les autres moteurs. Leur présence permet d'afficher des rich snippets breadcrumb directement dans les résultats de recherche, ce qui améliore le taux de clic (CTR) en donnant aux utilisateurs une indication visuelle de la position de la page dans le site avant même de cliquer.
<nav aria-label="Fil d'Ariane" itemscope itemtype="https://schema.org/BreadcrumbList">
<ol>
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a itemprop="item" href="https://monsite.fr/">
<span itemprop="name">Accueil</span>
</a>
<meta itemprop="position" content="1">
</li>
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a itemprop="item" href="https://monsite.fr/blog/categorie/seo-referencement/">
<span itemprop="name">SEO & Référencement</span>
</a>
<meta itemprop="position" content="2">
</li>
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<span itemprop="name">Redirections et breadcrumbs</span>
<meta itemprop="position" content="3">
</li>
</ol>
</nav>
La dernière entrée (page courante) n'est délibérément pas cliquable : Schema.org recommande que le dernier élément d'un BreadcrumbList représente la page active, sans lien vers elle-même.
Bloc JSON-LD complémentaire
En parallèle du HTML avec microdata, un bloc JSON-LD est injecté dans le <head> de la page :
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Accueil",
"item": "https://monsite.fr/"
},
{
"@type": "ListItem",
"position": 2,
"name": "SEO & Référencement",
"item": "https://monsite.fr/blog/categorie/seo-referencement/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Redirections et breadcrumbs"
}
]
}
</script>
La présence simultanée des microdata et du JSON-LD n'est pas redondante : Google traite indépendamment les deux formats et recommande lui-même le JSON-LD pour les nouvelles implémentations, tandis que les microdata offrent une meilleure compatibilité avec les parseurs tiers et les outils de scraping sémantique.
Intégration dans le thème
Par convention, le breadcrumb est affiché dans le template de thème juste au-dessus du <h1>. Le thème contrôle entièrement le CSS — BreadcrumbBuilder produit uniquement le HTML structuré, sans aucune classe ni style inline imposé.
<?php if ($tplOpts['show_breadcrumb'] ?? true): ?>
<nav class="breadcrumb" aria-label="Fil d'Ariane">
<?= BreadcrumbBuilder::render('post', $page, $settings) ?>
</nav>
<?php endif; ?>
<h1><?= Security::clean($page['h1'] ?? $page['title'] ?? '') ?></h1>
L'option show_breadcrumb est contrôlable depuis les réglages de présentation du thème (Admin → Thèmes → Présentation), ce qui permet de l'activer ou de le désactiver sans modifier aucun fichier de template. Par défaut, le breadcrumb est affiché sur les articles et les pages statiques, mais masqué sur la page d'accueil du blog (où il n'apporterait pas de valeur de navigation supplémentaire).
Redirections et fil d'Ariane : synergie SEO
Ces deux fonctionnalités sont complémentaires dans une stratégie SEO cohérente. Les redirections 301 préservent l'équité de liens (link equity) lors des changements structurels d'un site — elles garantissent que les URLs historiquement liées depuis des sites tiers continuent de transmettre leur valeur. Le fil d'Ariane, quant à lui, structure la navigation interne et communique aux moteurs de recherche la hiérarchie du site, ce qui favorise une meilleure compréhension de l'architecture et contribue à la pertinence thématique des pages de catégorie.
Combinées avec le sitemap XML automatique et les balises canoniques gérées par QuietCMS, ces deux fonctionnalités constituent un socle SEO technique solide qui élimine les principales causes de pénalisation par les moteurs : contenu dupliqué dû aux URLs multiples, pages orphelines, signaux de lien dilués et structure de site opaque.
Articles similaires
JSON-LD et Open Graph par article
QuietCMS génère automatiquement JSON-LD (Article, WebPage, BreadcrumbList) et Open Graph par page et article.
llms.txt — optimiser l'indexation par les IA
Découvrez llms.txt, la spécification émergente pour guider les crawlers IA (ChatGPT, Claude, Gemini) vers le contenu le…
Le protocole Sitemap XML — standards et bonnes pratiques
Tout comprendre sur le protocole sitemap XML : balises loc, lastmod, priority, extensions image/video, et comment QuietC…