Rewrites
Rewrites ermöglichen es Ihnen, einen eingehenden Anfragepfad einem anderen Zielpfad zuzuordnen.
Rewrites fungieren als URL-Proxy und maskieren den Zielpfad, sodass es so aussieht, als hätte der Benutzer seinen Standort auf der Website nicht geändert. Im Gegensatz dazu leiten Redirects zu einer neuen Seite weiter und zeigen die URL-Änderungen an.
Um Rewrites zu verwenden, können Sie den rewrites
-Schlüssel in next.config.js
nutzen:
Rewrites werden auf das Client-seitige Routing angewendet, ein <Link href="/about">
würde in obigem Beispiel den Rewrite anwenden.
rewrites
ist eine asynchrone Funktion, die entweder ein Array oder ein Objekt von Arrays (siehe unten) zurückgeben soll, das Objekte mit den Eigenschaften source
und destination
enthält:
source
:String
- der eingehende Anfragepfad-Muster.destination
:String
- der Pfad, zu dem geroutet werden soll.basePath
:false
oderundefined
- wenn false, wird der basePath beim Matching nicht berücksichtigt, kann nur für externe Rewrites verwendet werden.locale
:false
oderundefined
- ob das Locale beim Matching nicht berücksichtigt werden soll.has
ist ein Array von has-Objekten mit den Eigenschaftentype
,key
undvalue
.missing
ist ein Array von missing-Objekten mit den Eigenschaftentype
,key
undvalue
.
Wenn die rewrites
-Funktion ein Array zurückgibt, werden Rewrites nach der Überprüfung des Dateisystems (Seiten und /public
-Dateien) und vor dynamischen Routen angewendet. Wenn die rewrites
-Funktion ein Objekt von Arrays mit einer bestimmten Struktur zurückgibt, kann dieses Verhalten geändert und feiner kontrolliert werden, ab v10.1
von Next.js:
Gut zu wissen: Rewrites in
beforeFiles
überprüfen das Dateisystem/dynamische Routen nicht unmittelbar nach dem Matching einer Source, sie werden weiter überprüft, bis allebeforeFiles
abgearbeitet sind.
Die Reihenfolge, in der Next.js Routen überprüft werden, ist:
- Headers werden überprüft/angewendet
- Redirects werden überprüft/angewendet
beforeFiles
-Rewrites werden überprüft/angewendet- Statische Dateien aus dem public-Verzeichnis,
_next/static
-Dateien und nicht-dynamische Seiten werden überprüft/bereitgestellt afterFiles
-Rewrites werden überprüft/angewendet, wenn eines dieser Rewrites matched, werden dynamische Routen/statische Dateien nach jedem Match überprüftfallback
-Rewrites werden überprüft/angewendet, diese werden vor dem Rendern der 404-Seite und nach der Überprüfung dynamischer Routen/aller statischen Assets angewendet. Wenn Sie fallback: true/'blocking' ingetStaticPaths
verwenden, werden die in Ihrernext.config.js
definiertenfallback
-Rewrites nicht ausgeführt.
Rewrite-Parameter
Wenn Parameter in einem Rewrite verwendet werden, werden die Parameter standardmäßig in der Query übergeben, wenn keiner der Parameter in der destination
verwendet wird.
Wenn ein Parameter in der Destination verwendet wird, werden keine Parameter automatisch in der Query übergeben.
Sie können die Parameter dennoch manuell in der Query übergeben, wenn einer bereits in der Destination verwendet wird, indem Sie die Query in der destination
angeben.
Gut zu wissen: Statische Seiten aus Automatic Static Optimization oder Prerendering Parameter von Rewrites werden nach der Hydration auf dem Client geparst und in der Query bereitgestellt.
Pfad-Matching
Pfad-Matches sind erlaubt, zum Beispiel wird /blog/:slug
mit /blog/hello-world
matchen (keine verschachtelten Pfade):
Wildcard-Pfad-Matching
Um einen Wildcard-Pfad zu matchen, können Sie *
nach einem Parameter verwenden, zum Beispiel wird /blog/:slug*
mit /blog/a/b/c/d/hello-world
matchen:
Regex-Pfad-Matching
Um einen Regex-Pfad zu matchen, können Sie den Regex in Klammern nach einem Parameter einschließen, zum Beispiel wird /blog/:slug(\\d{1,})
mit /blog/123
matchen, aber nicht mit /blog/abc
:
Die folgenden Zeichen (
, )
, {
, }
, [
, ]
, |
, \
, ^
, .
, :
, *
, +
, -
, ?
, $
werden für Regex-Pfad-Matching verwendet, daher müssen sie, wenn sie in der source
als nicht-spezielle Werte verwendet werden, durch Hinzufügen von \\
vor ihnen escaped werden:
Header-, Cookie- und Query-Matching
Um einen Rewrite nur dann anzuwenden, wenn Header-, Cookie- oder Query-Werte ebenfalls übereinstimmen, kann das Feld has
verwendet werden, oder das Feld missing
, wenn sie nicht übereinstimmen sollen. Sowohl die source
als auch alle has
-Elemente müssen übereinstimmen und alle missing
-Elemente dürfen nicht übereinstimmen, damit der Rewrite angewendet wird.
has
- und missing
-Elemente können die folgenden Felder haben:
type
:String
- muss entwederheader
,cookie
,host
oderquery
sein.key
:String
- der Schlüssel des ausgewählten Typs, gegen den gematcht werden soll.value
:String
oderundefined
- der zu überprüfende Wert, wenn undefined, wird jeder Wert gematcht. Ein regex-ähnlicher String kann verwendet werden, um einen bestimmten Teil des Werts zu erfassen, z.B. wenn der Wertfirst-(?<paramName>.*)
fürfirst-second
verwendet wird, dann kannsecond
in der Destination mit:paramName
verwendet werden.
Rewriting zu einer externen URL
Beispiele
Rewrites ermöglichen es Ihnen, zu einer externen URL umzuleiten. Dies ist besonders nützlich für die schrittweise Einführung von Next.js. Das folgende Beispiel zeigt einen Rewrite, der die /blog
-Route Ihrer Haupt-App zu einer externen Site umleitet.
Wenn Sie trailingSlash: true
verwenden, müssen Sie auch einen nachgestellten Schrägstrich in den source
-Parameter einfügen. Wenn der Zielserver ebenfalls einen nachgestellten Schrägstrich erwartet, sollte dieser auch im destination
-Parameter enthalten sein.
Schrittweise Einführung von Next.js
Sie können Next.js auch so konfigurieren, dass es nach der Überprüfung aller Next.js-Routen auf einen Proxy für eine bestehende Website zurückfällt.
Auf diese Weise müssen Sie die Rewrite-Konfiguration nicht ändern, wenn Sie weitere Seiten zu Next.js migrieren.
Rewrites mit basePath-Unterstützung
Wenn Sie basePath
-Unterstützung mit Rewrites verwenden, wird jeder source
- und destination
-Pfad automatisch mit dem basePath
präfixiert, es sei denn, Sie fügen basePath: false
zum Rewrite hinzu:
Rewrites mit i18n-Unterstützung
Wenn Sie i18n
-Unterstützung mit Rewrites verwenden, wird jeder source
- und destination
-Pfad automatisch präfixiert, um die konfigurierten locales
zu handhaben, es sei denn, Sie fügen locale: false
zum Rewrite hinzu. Wenn locale: false
verwendet wird, müssen Sie source
und destination
mit einem Locale präfixieren, damit sie korrekt gematcht werden können.
Versionsverlauf
Version | Änderungen |
---|---|
v13.3.0 | missing hinzugefügt. |
v10.2.0 | has hinzugefügt. |
v9.5.0 | Header-Unterstützung hinzugefügt. |