Urls
Dans ce docs, on va détailler le processus mise en place pour gérer les urls dynamiques des contenus issus du CMS de Maps system.
Segment dynamique de Next.js
Afin de gérer des paramètres dynamique des urls, Next nous offre la possibilité de définir des segments dynamiques
Dans l'arborescence du router, on retrouvera des noms de dossier avec le partern suivant
/[myVar]
Ici myVar représente une variable dans l'url.
Cette variable est accessible dans les props de la page associé à ce noeud du router, dans l'objet params
Par défaut, Next authosise toutes les valeurs possibles, mais il est possible de restreindre l'accès à certaine valeur.
Generating Static Params
Generating Static Params
Le but de cette fonction est de définir les valeurs possibles pour un segment donné afin de générer au build les pages afin de pouvoir les rendrent statiquement.
Cette fonction est appelé côté serveur à chaque requête quand on a la varaible d'environement NODE_ENV=development. Sinon elle est exécuter une fois au build.
On peut, en complement de cette fonction, ajouter l'export suivant:
export const dynamicParams = false;
Dans ce cas, uniquement les valeurs retournées par generateStaticParams ne seront valide dans le router next. Si on visite une url inconnue => 404.
Si ce paramètre est absent ou à true, alors essayera de rendre la page en côté serveur.
Revalidate: intéraction entre Next et Fetch
Next.js et l'api fetch ont une relation privilégiée. L'équipe de Next à étendu le comportement de fetch afin d'inclure du cache
Fetch cache
Il est également possible de regénérer des pages qui on été rendu statiquement. On peut régler un TTL manuellement page par page grace à revalidate
On peut également mettre en place une mécanique de revalidation à la demande avec revalidatePath
Url en V4
Le CMS de Maps Systems nous fournis diverse collections de documents: établissements, chambres, homepages, etc...
Chaque collection dispose d'un attribut label qui est traduit en FR / EN / NL
Ce champ est transformé en slug à l'embasement. Le français étant la langue par défaut si une traduction n'existerais pas.
Afin d'associer les templates de pages de Next aux données récupérer du PIM, nous devons recomposer nos urls en retournant via generateStaticParams TOUTES les combinaisons possibles de paramètres dynamiques de l'url.
Composition des URLs
- odalys-vacances.com/ : Homepage
- odalys-vacances.com?part=X : Homepage partenaire => url technique /homepage/[partId]
- odalys-vacances.com/typeDeVacance: sous homepage type de vacances
- odalys-vacances.com/typeDeVacance/place: page de recherche place (pays ou région)
- odalys-vacances.com/typeDeVacance/place/station: page de recherche station
- odalys-vacances.com/typeDeVacance/place/produit: page produit (établissement ou package)
- odalys-vacances.com/thematique/theme: Homepage thématique
- odalys-vacances.com/theme: page recherche thématique => url technique /thematicPage/[slug]
- odalys-vacances.com/guide: page statique guide => url technique /guide/[slug]
- odalys-vacances.com/page-v4: page statique v4 => url technique /page-v4/[slug]
- odalys-vacances.com/page-standard: page statique standard => url technique /page-standard/[slug]
- odalys-vacances.com/cgos/page-cgos: page statique cgos
En gras, les segments dynamiques de l'url.
Pour les URL technique, voir le chapitre Rewrite d'url
Cas particulier: Slug des types de vacances
Dans le CMS Maps, les sous homepage type de vacances nom pas de slug, mais elles sont rattachées à un type de vacances. Pour récupérer le slug associé à un type de vacances, il faut intéroger Boom. Un collection gère les différents types de vacances et des apis sont diponibles pour récupérer ces infos.
Récupération du slug à partir d'un ID
https://admin.nonprod-web.odalys-aws.com/api/vacationTypes/code/58
Récupérer l'id du type de vacances à partir d'un slug
https://admin.nonprod-web.odalys-aws.com/api/vacationTypes/slug/location-mer
Récupérer toute la collection de types de vacances
Traductions et URL
On utilise NextIntl pour gérer les traductions sur le site. NextIntl rajoute un noeud [locale] en entrée du router.
Il ne faudra pas oublier de le renseigner dans generateStaticParams
Ce paramètre n'est pas présent dans l'url final, mais sert a choisir le bon sous-domaine du site. Configuration par domaine
Ex:
- FR: https://fr.nonprod-web.odalys-aws.com/
- EN: https://en.nonprod-web.odalys-aws.com/
- NL: https://nl.nonprod-web.odalys-aws.com/
NextIntl permet également de traduire nos urls: Localized PathNames
Ex:
- FR: https://fr.nonprod-web.odalys-aws.com/recherche
- EN: https://en.nonprod-web.odalys-aws.com/search
- NL: https://nl.nonprod-web.odalys-aws.com/zoeken
Rewrite d'url
Le modèle SEO d'Odalys-vacances présente un point de complexité qu'il faut régler via des réécritures d'url. En effet, il existe plusieurs urls qui partage un pattern commun dans le structure, mais affiche des templates de page complètement différente.
Par exemeple
- https://www.odalys-vacances.com/location-montagne: Sous-Homepage type de vacances montagne
- https://www.odalys-vacances.com/vacances-dernieres-minutes: Page de recherche thématique
Malheuresement, Next ne nous permet pas d'avoir deux segments dynamique au même niveau.
Pour pallier à cette limitation technique, la solution adopter consite a créer une "route technique" dans le routeur Next et de générer une règle de réécriture d'url pour faire matcher la "bonne url" d'un point de vue SEO vers la "route technique"
Exemple avec les urls ci-dessus
Dans next on construit du répertoire dynamique avec un préfix statique pour différencier les deux templates
/[vacationType]/page.tsx
/thematicPage/[slug]/page.tsx
Il s'agit bien de deux routes différentes pour Next
Via generateStaticParams, on rend les urls suivante
une url "classique": OK SEO
/location-montagne
une url "technique": KO SEO
/thematicPage/vacances-dernieres-minutes
Étant donnée qu'on toutes les infos pour construire les urls dans generateStaticParams, on a également toutes les infos pour savoir qu'elles sont les urls "classiques" et les urls "techniques"
On rajoute un règle de réécriture
si on me demande l'url /vacances-dernieres-minutes, je sais que c'est une page de recherche thématique, car j'ai tout les slugs en base, donc je réécrit l'url
en /thematicPage/vacances-dernieres-minutes
Attention à ne pas confondre url rewriting et url redirect
Rewrite change la destination de la page, sans modifier l'url, c'est transparent
Ici: il demande /vacances-dernieres-minutes, mais on lui sert le contenu de /thematicPage/vacances-dernieres-minutes
Redirect nous renvoie vers une autre page, ça change l'url
je demande /vacances-dernieres-minutes, je suis redirigé vers /thematicPage/vacances-dernieres-minutes dans mon navigateur
Documentation rewrite
Documentation redirect