URLs et slugs
Chaque contenu public obtient une URL — et une fois publiée, cette URL est la URL. La changer invalide les bookmarks, casse les liens entrants et peut nuire au SEO. Cette page documente comment
Chaque contenu public obtient une URL — et une fois publiée, cette URL est la URL. La changer invalide les bookmarks, casse les liens entrants et peut nuire au SEO. Cette page documente comment Flexweg CMS construit les URLs et comment il prévient les collisions.
Patterns d'URL
| Contenu | Pattern d'URL |
|---|---|
| Accueil | /index.html |
| Page top-level | /<slug-page>.html |
| Post avec catégorie principale | /<slug-catégorie>/<slug-post>.html |
| Post sans catégorie principale | /<slug-post>.html |
| Archive de catégorie | /<slug-catégorie>/index.html |
| Fallback 404 | /404.html |
| Tag | (pas d'URL) |
Les tags n'apparaissent jamais dans les URLs. Ce sont des métadonnées pour le filtrage et l'affichage par le thème uniquement.
Les patterns sont fixes. Pas de support pour les structures de permalien personnalisées (basées sur la date, l'ID, les chemins hiérarchiques) comme WordPress. Le CMS choisit la prédictibilité plutôt que la flexibilité.
URLs canoniques
Les URLs canoniques (celles qui apparaissent dans <link rel="canonical"> et dans les sitemaps) suppriment /index.html :
- Home :
/(au lieu de/index.html) - Archive de catégorie :
/<slug>/(au lieu de/<slug>/index.html)
Les deux formes résolvent vers le même fichier sur Flexweg, mais la forme à slash final est la canonique préférée par les moteurs de recherche. Le helper canonicalUrl(baseUrl, path) du runtime fait cette normalisation pour tous les thèmes.
Règles de slug
Chaque slug doit être :
- Lettres ASCII minuscules + chiffres + tirets uniquement —
[a-z0-9-]+ - Pas de tirets en début ou fin
- Pas de double-tirets
- Pas d'espaces, slashes, points, accents, caractères spéciaux
Le helper slugify() du runtime normalise un titre arbitraire vers un slug valide. isValidSlug() est le validateur.
Collisions de slug
Quand vous tapez un slug, l'admin vérifie en temps réel :
- Le slug existe-t-il déjà dans la même catégorie ? — Pour les posts, deux slugs identiques dans la même catégorie produiraient le même fichier
<catégorie>/<slug>.html. La validation bloque. - Le slug entre-t-il en collision avec une page top-level ? — Pour les posts sans catégorie ET les pages, le pattern URL est
/<slug>.html; un post nomméaboutet une page nomméeaboutcollisionneraient. - Le slug entre-t-il en collision avec une catégorie ? — Une page
recipes.htmlcollisionnerait avec l'archive de catégorie/recipes/index.htmlsi quelqu'un tape/recipesdans la barre d'adresse.
L'admin compare sur le chemin URL final, pas sur le slug brut — deux slugs peuvent matcher sans collisionner (un slug de post et un slug de catégorie peuvent être identiques car leurs URLs diffèrent).
En cas de collision sur un slug auto-généré, findAvailableSlug ajoute -2, -3, etc. jusqu'à trouver un libre. En cas de collision sur un slug saisi par l'utilisateur, une erreur inline est affichée et le bouton Sauvegarder est désactivé.
Nettoyage des chemins stales
Quand vous changez le slug ou la catégorie d'un post publié, le pipeline de publication :
- Calcule le nouveau chemin
- Supprime l'ancien fichier sur Flexweg (
Post.lastPublishedPath) - Upload le nouveau fichier au nouveau chemin
- Met à jour
Post.lastPublishedPathen base
Si la suppression échoue (réseau, 5xx), le chemin reste dans Post.previousPublishedPaths[] et est retenté à la prochaine publication. C'est ce qui empêche le site de se retrouver avec deux versions d'un même contenu à deux URLs différentes.
Plugin multilang
En mode multilang, chaque langue secondaire produit ses fichiers à <lang>/<...> :
- Post :
/fr/<slug-catégorie-traduit>/<slug-post-traduit>.html - Page :
/fr/<slug-page-traduit>.html - Archive de catégorie :
/fr/<slug-catégorie-traduit>/ - Home :
/fr/(ou page statique dédiée pour la langue)
La langue primaire utilise les patterns sans préfixe.