Réécritures (rewrites)
Les réécritures vous permettent de mapper un chemin de requête entrant vers un chemin de destination différent.
Les réécritures agissent comme un proxy d'URL et masquent le chemin de destination, donnant l'impression que l'utilisateur n'a pas changé d'emplacement sur le site. En revanche, les redirections redirigeront vers une nouvelle page et afficheront les changements d'URL.
Pour utiliser les réécritures, vous pouvez utiliser la clé rewrites
dans next.config.js
:
Les réécritures sont appliquées au routage côté client. Un <Link href="/about">
aura la réécriture appliquée dans l'exemple ci-dessus.
rewrites
est une fonction asynchrone qui doit retourner soit un tableau, soit un objet de tableaux (voir ci-dessous) contenant des objets avec les propriétés source
et destination
:
source
:String
- le motif du chemin de requête entrant.destination
:String
- le chemin vers lequel vous souhaitez router.basePath
:false
ouundefined
- si false, le basePath ne sera pas inclus lors de la correspondance, peut être utilisé uniquement pour les réécritures externes.locale
:false
ouundefined
- indique si la locale ne doit pas être incluse lors de la correspondance.has
est un tableau d'objets has avec les propriétéstype
,key
etvalue
.missing
est un tableau d'objets missing avec les propriétéstype
,key
etvalue
.
Lorsque la fonction rewrites
retourne un tableau, les réécritures sont appliquées après la vérification du système de fichiers (pages et fichiers /public
) et avant les routes dynamiques. Lorsque la fonction rewrites
retourne un objet de tableaux avec une forme spécifique, ce comportement peut être modifié et contrôlé plus finement, à partir de v10.1
de Next.js :
Bon à savoir : les réécritures dans
beforeFiles
ne vérifient pas immédiatement le système de fichiers/les routes dynamiques après avoir trouvé une correspondance pour une source, elles continuent jusqu'à ce que toutes lesbeforeFiles
aient été vérifiées.
L'ordre dans lequel Next.js vérifie les routes est :
- Les en-têtes sont vérifiés/appliqués
- Les redirections sont vérifiées/appliquées
- Les réécritures
beforeFiles
sont vérifiées/appliquées - Les fichiers statiques du répertoire public, les fichiers
_next/static
et les pages non dynamiques sont vérifiés/servis - Les réécritures
afterFiles
sont vérifiées/appliquées ; si l'une de ces réécritures correspond, nous vérifions les routes dynamiques/fichiers statiques après chaque correspondance - Les réécritures
fallback
sont vérifiées/appliquées ; elles sont appliquées avant le rendu de la page 404 et après la vérification des routes dynamiques/tous les actifs statiques. Si vous utilisez fallback: true/'blocking' dansgetStaticPaths
, les réécrituresfallback
définies dans votrenext.config.js
ne seront pas exécutées.
Paramètres de réécriture
Lorsque vous utilisez des paramètres dans une réécriture, les paramètres seront passés dans la requête par défaut lorsqu'aucun des paramètres n'est utilisé dans la destination
.
Si un paramètre est utilisé dans la destination, aucun des paramètres ne sera automatiquement passé dans la requête.
Vous pouvez toujours passer les paramètres manuellement dans la requête si l'un est déjà utilisé dans la destination en spécifiant la requête dans la destination
.
Bon à savoir : Les pages statiques de l'Optimisation Statique Automatique ou les paramètres de prérendu des réécritures seront analysés côté client après l'hydratation et fournis dans la requête.
Correspondance de chemin
Les correspondances de chemin sont autorisées, par exemple /blog/:slug
correspondra à /blog/hello-world
(pas de chemins imbriqués) :
Correspondance de chemin avec joker
Pour correspondre à un chemin avec joker, vous pouvez utiliser *
après un paramètre, par exemple /blog/:slug*
correspondra à /blog/a/b/c/d/hello-world
:
Correspondance de chemin avec regex
Pour correspondre à un chemin avec regex, vous pouvez encapsuler la regex entre parenthèses après un paramètre, par exemple /blog/:slug(\\d{1,})
correspondra à /blog/123
mais pas à /blog/abc
:
Les caractères suivants (
, )
, {
, }
, [
, ]
, |
, \
, ^
, .
, :
, *
, +
, -
, ?
, $
sont utilisés pour la correspondance de chemin regex, donc lorsqu'ils sont utilisés dans la source
comme valeurs non spéciales, ils doivent être échappés en ajoutant \\
avant eux :
Correspondance d'en-tête, de cookie et de requête
Pour ne correspondre à une réécriture que lorsque les valeurs d'en-tête, de cookie ou de requête correspondent également, le champ has
peut être utilisé, ou le champ missing
pour les valeurs qui ne doivent pas correspondre. À la fois la source
et tous les éléments has
doivent correspondre, et tous les éléments missing
ne doivent pas correspondre pour que la réécriture soit appliquée.
Les éléments has
et missing
peuvent avoir les champs suivants :
type
:String
- doit être soitheader
,cookie
,host
ouquery
.key
:String
- la clé du type sélectionné à comparer.value
:String
ouundefined
- la valeur à vérifier, si undefined n'importe quelle valeur correspondra. Une chaîne de type regex peut être utilisée pour capturer une partie spécifique de la valeur, par exemple si la valeurfirst-(?<paramName>.*)
est utilisée pourfirst-second
, alorssecond
pourra être utilisé dans la destination avec:paramName
.
Réécriture vers une URL externe
Exemples
Les réécritures vous permettent de réécrire vers une URL externe. Ceci est particulièrement utile pour adopter Next.js de manière progressive. Voici un exemple de réécriture pour rediriger la route /blog
de votre application principale vers un site externe.
Si vous utilisez trailingSlash: true
, vous devez également insérer une barre oblique à la fin dans le paramètre source
. Si le serveur de destination attend également une barre oblique à la fin, elle doit être incluse dans le paramètre destination
.
Adoption progressive de Next.js
Vous pouvez également faire en sorte que Next.js se rabatte sur un proxy vers un site web existant après avoir vérifié toutes les routes Next.js.
De cette façon, vous n'avez pas besoin de modifier la configuration des réécritures lorsque vous migrez plus de pages vers Next.js.
Réécritures avec support de basePath
Lorsque vous utilisez le support de basePath
avec des réécritures, chaque source
et destination
est automatiquement préfixé avec le basePath
sauf si vous ajoutez basePath: false
à la réécriture :
Réécritures avec support i18n
Lorsque vous utilisez le support i18n
avec des réécritures, chaque source
et destination
est automatiquement préfixé pour gérer les locales
configurées, sauf si vous ajoutez locale: false
à la réécriture. Si locale: false
est utilisé, vous devez préfixer la source
et la destination
avec une locale pour qu'elle corresponde correctement.
Historique des versions
Version | Changements |
---|---|
v13.3.0 | Ajout de missing . |
v10.2.0 | Ajout de has . |
v9.5.0 | Ajout des en-têtes. |