Concevoir un maillage interne stratégique
Navigation optimisée, liens stratégiques et liens automatisés.

Le maillage interne, c’est la partie d’un site programmatique que l’on génère en dernier alors qu’il faudrait la concevoir en premier. Votre template décide, pour toutes les pages à la fois, des URL que Google peut atteindre, de celles qui paraissent importantes et de l’endroit où part le visiteur ensuite. Une mauvaise règle se recopie sur chaque page, une bonne aussi.
Tout au long de ce chapitre, prenons un site d’emploi avec 40 catégories de métiers et 500 villes françaises. Cela donne 20 000 pages possibles du type « Emploi infirmier à Lyon », et personne ne placera jamais ces liens à la main.
Ce que font vraiment les liens sur un site généré
Leur première mission est la découverte. Un sitemap signale à Google qu’une URL existe, mais une page sans lien entrant est orpheline : aucun contexte, aucun chemin pour un robot et très peu de raisons de la traiter en priorité. Sur un gros site, ce sont souvent ces pages-là qui restent des mois au statut « Détectée, actuellement non indexée ».
La deuxième est de répartir le PageRank. Votre page d’accueil, vos guides et vos meilleures pages hub concentrent l’essentiel des backlinks. Les liens internes font descendre cette autorité vers la longue traîne. Si un guide sur les meilleurs employeurs du secteur infirmier obtient des liens de la presse, il doit pointer vers les pages villes qu’il mentionne.
La troisième est de faire avancer les gens. Un visiteur sur « Emploi infirmier à Lyon » qui trouve trop peu d’offres veut voir Villeurbanne juste à côté, ou les postes d’aide-soignant à Lyon. Un SaaS qui publie des pages de cas d’usage suit la même logique vers d’autres cibles : l’essai gratuit, les preuves clients, le tutoriel détaillé. Chaque lien doit mener quelque part où un visiteur choisirait réellement d’aller.
Construisez la hiérarchie avant les liens
Je dessine toujours trois niveaux avant d’écrire la moindre règle de lien. Chacun a un rôle distinct.
| Niveau | Exemple site d’emploi | Volume | Rôle |
|---|---|---|---|
| Pilier | Emploi infirmier en France | 40 | Vise la requête large, reçoit des liens de tout ce qui est en dessous |
| Secondaire | Emploi infirmier en Bretagne | 40 × 13 régions | Regroupe les villes et les liste toutes |
| Détail | Emploi infirmier à Rennes | jusqu’à 20 000 | Vise la requête précise, porte les vraies offres |
Avec cette forme, chaque page ville se trouve à trois clics de l’accueil : accueil, pilier, région, ville. Cela ne tient que si chaque page région liste toutes ses villes, en liens simples. Un widget « top 10 des villes » laisse les 490 autres sur le bord de la route.
Les liens circulent alors dans trois directions. Vers le haut, par le fil d’Ariane. Vers le bas, par les listes des piliers et des régions. Latéralement, entre pages qui partagent un métier ou un lieu : c’est là que les sites programmatiques ont un avantage, puisque la donnée sait déjà ce qui est proche.
Les blocs de liens dont chaque template a besoin
| Bloc | Emplacement | Règle tirée des données | Exemple d’ancre |
|---|---|---|---|
| Fil d’Ariane | Haut de page | Catégorie parente, région parente | Emploi infirmier en Bretagne |
| Villes proches | Après les offres | Même métier, 5 villes les plus proches avec des postes ouverts | Emploi infirmier à Vannes |
| Métiers proches | Après les offres | Même ville, 5 catégories les plus proches | Emploi aide-soignant à Rennes |
| Lien contextuel | Dans l’introduction | Un lien vers le guide le plus pertinent | le salaire d’un infirmier en Bretagne |
| Conversion | Barre latérale ou fin de page | Même lien partout, formulation adaptée au métier | publier une offre d’infirmier |
Le lien contextuel compte plus qu’on ne le pense. Un lien pris dans une phrase porte davantage de sens qu’un lien dans une liste : écrivez-en au moins un dans le texte éditorial du template, avec une cible choisie à partir des données.
Générez les liens depuis les données, puis stockez-les
Traitez les liens comme de la donnée. Je les calcule dans une table au lieu de les improviser dans le template, parce qu’une table se vérifie, se compare et se restaure. Voici le bloc latéral en PostgreSQL, avec une table pages et une table city_neighbors qui contient les distances :
INSERT INTO page_links (source_id, target_id, block)
SELECT p.id, t.id, 'nearby_cities'
FROM pages p
JOIN LATERAL (
SELECT target.id
FROM city_neighbors cn
JOIN pages target
ON target.city_id = cn.neighbor_id
AND target.job_id = p.job_id
WHERE cn.city_id = p.city_id
AND target.published
AND target.open_roles > 0
ORDER BY cn.distance_km
LIMIT 5
) t ON true
WHERE p.published;
Les deux filtres de la sous-requête font le travail important. Ne liez jamais une page non publiée, ni une page vide. Une page sans aucune offre ne devrait même pas exister : la politique de Google sur l’abus de contenu à grande échelle vise les pages produites en masse et sans valeur, et votre graphe de liens indique très directement quelles pages vous jugez dignes d’une visite.
Pour voir cette logique en production, le maillage interne faisait partie des 90+ variables du projet Deux.io, aux côtés des titres, des schémas et des articles mis en avant. La structure de la table dépend de votre modèle, que le chapitre sur la base de données détaille.
Variez les ancres, mais gardez-les stables
Des milliers d’ancres identiques vers la même page paraissent mécaniques et décrivent moins bien la cible. Écrivez quelques modèles et attribuez-en un par page source.
| Modèle | Résultat |
|---|---|
Emploi {job} à {city} |
Emploi infirmier à Vannes |
Emploi {job} autour de {city} |
Emploi infirmier autour de Vannes |
Travailler comme {job} à {city} |
Travailler comme infirmier à Vannes |
Choisissez le modèle avec une règle déterministe, par exemple source_id % 3. Avec un tirage aléatoire, chaque build réécrit des milliers d’ancres pour rien, et vous ne saurez plus ce qui a changé quand les positions bougeront.
Sortez un HTML que les robots peuvent suivre
Google suit les éléments <a> dotés d’un href. Sa documentation sur les liens est courte et mérite une lecture. Rendez ces blocs côté serveur, dans le HTML initial.
<nav aria-label="Villes proches">
<h2>Emploi infirmier près de Rennes</h2>
<ul>
<li><a href="/jobs/nursing/vannes">Emploi infirmier à Vannes</a></li>
<li><a href="/jobs/nursing/saint-malo">Emploi infirmier autour de Saint-Malo</a></li>
</ul>
</nav>
Un <span onclick>, un bouton qui charge plus de résultats ou un bloc injecté après une action de l’utilisateur ne remplissent pas ce rôle. Laissez aussi nofollow hors de vos liens internes : il ne sert pas à orienter le PageRank et dit seulement à Google de ne pas se fier à votre propre lien. Les robots qui alimentent les réponses d’IA ont besoin des mêmes chemins en HTML simple, et beaucoup exécutent moins de JavaScript que Googlebot.
Le fil d’Ariane mérite ses liens visibles et son balisage BreadcrumbList, que le chapitre sur les microdonnées détaille.
Auditez le graphe à intervalles réguliers
Comme les liens vivent dans une table, trouver les orphelines tient en une requête :
SELECT p.slug
FROM pages p
LEFT JOIN page_links l ON l.target_id = p.id
WHERE p.published
AND l.target_id IS NULL;
Comparez ensuite avec la réalité. Crawlez le site depuis l’accueil avec Screaming Frog et confrontez les URL trouvées à votre liste de pages publiées : tout écart signifie que le HTML ne correspond pas à la table. Dans la Search Console, le rapport Liens montre les pages qui reçoivent le plus de liens internes, et cette liste doit ressembler à votre hiérarchie. Le rapport d’indexation des pages indique si les pages détail restent bloquées au stade de la découverte. J’explique comment lancer ces contrôles automatiquement dans le chapitre sur les audits SEO.
Votre prochaine étape : dessinez les trois niveaux de votre site sur une page, écrivez en une phrase la règle derrière chaque bloc de liens, et vérifiez que chaque règle peut s’appuyer sur une colonne que vous avez déjà. Tout bloc qui réclame une colonne manquante passe sur la liste du modèle de données avant la construction du template.