Weiterleitungen
Weiterleitungen ermöglichen es Ihnen, einen eingehenden Anfragepfad auf einen anderen Zielpfad umzuleiten.
Um Weiterleitungen zu verwenden, können Sie den Schlüssel redirects
in next.config.js
nutzen:
module.exports = {
async redirects() {
return [
{
source: '/about',
destination: '/',
permanent: true,
},
]
},
}
redirects
ist eine asynchrone Funktion, die ein Array erwartet, das Objekte mit den Eigenschaften source
, destination
und permanent
enthält:
source
ist das Muster des eingehenden Anfragepfads.destination
ist der Pfad, zu dem umgeleitet werden soll.permanent
true
oderfalse
- wenntrue
, wird der Statuscode 308 verwendet, der Clients/Suchmaschinen anweist, die Weiterleitung dauerhaft zu cachen. Beifalse
wird der temporäre Statuscode 307 verwendet, der nicht gecacht wird.
Warum verwendet Next.js 307 und 308? Traditionell wurde 302 für temporäre Weiterleitungen und 301 für permanente Weiterleitungen verwendet, aber viele Browser haben die Anfragemethode der Weiterleitung unabhängig von der ursprünglichen Methode auf
GET
geändert. Wenn ein Browser beispielsweise eine Anfrage anPOST /v1/users
stellte, die den Statuscode302
mit dem Ort/v2/users
zurückgab, könnte die nachfolgende AnfrageGET /v2/users
sein statt des erwartetenPOST /v2/users
. Next.js verwendet die Statuscodes 307 (temporär) und 308 (permanent), um die verwendete Anfragemethode explizit beizubehalten.
basePath
:false
oderundefined
- wenn false, wirdbasePath
nicht beim Matching einbezogen, kann nur für externe Weiterleitungen verwendet werden.locale
:false
oderundefined
- ob das Locale beim Matching nicht einbezogen 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
.
Weiterleitungen werden vor dem Dateisystem überprüft, das Seiten und /public
-Dateien enthält.
Bei Verwendung des Pages-Routers werden Weiterleitungen nicht auf das clientseitige Routing (Link
, router.push
) angewendet, es sei denn, Middleware ist vorhanden und passt zum Pfad.
Wenn eine Weiterleitung angewendet wird, werden alle in der Anfrage bereitgestellten Query-Werte an das Weiterleitungsziel übergeben. Beispiel siehe folgende Weiterleitungskonfiguration:
{
source: '/old-blog/:path*',
destination: '/blog/:path*',
permanent: false
}
Wenn /old-blog/post-1?hello=world
angefragt wird, wird der Client zu /blog/post-1?hello=world
weitergeleitet.
Pfad-Matching
Pfad-Matches sind erlaubt, z.B. wird /old-blog/:slug
auf /old-blog/hello-world
passen (keine verschachtelten Pfade):
module.exports = {
async redirects() {
return [
{
source: '/old-blog/:slug',
destination: '/news/:slug', // Gematchte Parameter können im Ziel verwendet werden
permanent: true,
},
]
},
}
Wildcard-Pfad-Matching
Um einen Wildcard-Pfad zu matchen, können Sie *
nach einem Parameter verwenden, z.B. wird /blog/:slug*
auf /blog/a/b/c/d/hello-world
passen:
module.exports = {
async redirects() {
return [
{
source: '/blog/:slug*',
destination: '/news/:slug*', // Gematchte Parameter können im Ziel verwendet werden
permanent: true,
},
]
},
}
Regex-Pfad-Matching
Um einen Regex-Pfad zu matchen, können Sie den Regex in Klammern nach einem Parameter einschließen, z.B. wird /post/:slug(\\d{1,})
auf /post/123
passen, aber nicht auf /post/abc
:
module.exports = {
async redirects() {
return [
{
source: '/post/:slug(\\d{1,})',
destination: '/news/:slug', // Gematchte Parameter können im Ziel verwendet werden
permanent: false,
},
]
},
}
Die folgenden Zeichen (
, )
, {
, }
, :
, *
, +
, ?
werden für Regex-Pfad-Matching verwendet. Wenn sie in der source
als nicht-spezielle Werte vorkommen, müssen sie durch Voranstellen von \\
escaped werden:
module.exports = {
async redirects() {
return [
{
// dies matcht auf `/english(default)/something`
source: '/english\\(default\\)/:slug',
destination: '/en-us/:slug',
permanent: false,
},
]
},
}
Header-, Cookie- und Query-Matching
Um eine Weiterleitung nur dann auszuführen, wenn Header-, Cookie- oder Query-Werte ebenfalls übereinstimmen, kann das Feld has
verwendet werden, oder wenn sie nicht übereinstimmen, das Feld missing
. Sowohl die source
als auch alle has
-Elemente müssen übereinstimmen und alle missing
-Elemente dürfen nicht übereinstimmen, damit die Weiterleitung angewendet wird.
has
- und missing
-Elemente können folgende 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 prü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
im Ziel mit:paramName
verwendet werden.
module.exports = {
async redirects() {
return [
// wenn der Header `x-redirect-me` vorhanden ist,
// wird diese Weiterleitung angewendet
{
source: '/:path((?!another-page$).*)',
has: [
{
type: 'header',
key: 'x-redirect-me',
},
],
permanent: false,
destination: '/another-page',
},
// wenn der Header `x-dont-redirect` vorhanden ist,
// wird diese Weiterleitung NICHT angewendet
{
source: '/:path((?!another-page$).*)',
missing: [
{
type: 'header',
key: 'x-do-not-redirect',
},
],
permanent: false,
destination: '/another-page',
},
// wenn source, query und cookie übereinstimmen,
// wird diese Weiterleitung angewendet
{
source: '/specific/:path*',
has: [
{
type: 'query',
key: 'page',
// der page-Wert wird im Ziel nicht verfügbar sein,
// da value bereitgestellt wird und keine benannte
// Capture-Gruppe verwendet wird, z.B. (?<page>home)
value: 'home',
},
{
type: 'cookie',
key: 'authorized',
value: 'true',
},
],
permanent: false,
destination: '/another/:path*',
},
// wenn der Header `x-authorized` vorhanden ist und
// einen passenden Wert enthält, wird diese Weiterleitung angewendet
{
source: '/',
has: [
{
type: 'header',
key: 'x-authorized',
value: '(?<authorized>yes|true)',
},
],
permanent: false,
destination: '/home?authorized=:authorized',
},
// wenn der Host `example.com` ist,
// wird diese Weiterleitung angewendet
{
source: '/:path((?!another-page$).*)',
has: [
{
type: 'host',
value: 'example.com',
},
],
permanent: false,
destination: '/another-page',
},
]
},
}
Weiterleitungen mit basePath-Unterstützung
Bei Verwendung von basePath
-Unterstützung mit Weiterleitungen wird jeder source
und destination
automatisch mit dem basePath
präfixiert, es sei denn, Sie fügen basePath: false
zur Weiterleitung hinzu:
module.exports = {
basePath: '/docs',
async redirects() {
return [
{
source: '/with-basePath', // wird automatisch zu /docs/with-basePath
destination: '/another', // wird automatisch zu /docs/another
permanent: false,
},
{
// fügt /docs nicht hinzu, da basePath: false gesetzt ist
source: '/without-basePath',
destination: 'https://example.com',
basePath: false,
permanent: false,
},
]
},
}
Weiterleitungen mit i18n-Unterstützung
Bei Verwendung von i18n
-Unterstützung mit Weiterleitungen wird jeder source
und destination
automatisch präfixiert, um die konfigurierten locales
zu handhaben, es sei denn, Sie fügen locale: false
zur Weiterleitung hinzu. Wenn locale: false
verwendet wird, müssen Sie source
und destination
mit einem Locale präfixieren, damit sie korrekt gematcht werden.
module.exports = {
i18n: {
locales: ['en', 'fr', 'de'],
defaultLocale: 'en',
},
async redirects() {
return [
{
source: '/with-locale', // handhabt alle Locales automatisch
destination: '/another', // gibt das Locale automatisch weiter
permanent: false,
},
{
// handhabt Locales nicht automatisch, da locale: false gesetzt ist
source: '/nl/with-locale-manual',
destination: '/nl/another',
locale: false,
permanent: false,
},
{
// matcht '/', da `en` das defaultLocale ist
source: '/en',
destination: '/en/another',
locale: false,
permanent: false,
},
// es ist möglich, alle Locales zu matchen, auch wenn locale: false gesetzt ist
{
source: '/:locale/page',
destination: '/en/newpage',
permanent: false,
locale: false,
},
{
// wird zu /(en|fr|de)/(.*) konvertiert, matcht also nicht die Top-Level
// `/` oder `/fr` Routen wie /:path* es tun würde
source: '/(.*)',
destination: '/another',
permanent: false,
},
]
},
}
In seltenen Fällen müssen Sie möglicherweise einen benutzerdefinierten Statuscode für ältere HTTP-Clients festlegen, um eine korrekte Weiterleitung zu ermöglichen. In diesen Fällen können Sie die Eigenschaft statusCode
anstelle von permanent
verwenden, aber nicht beide. Um die IE11-Kompatibilität zu gewährleisten, wird für den Statuscode 308 automatisch ein Refresh
-Header hinzugefügt.
Andere Weiterleitungen
- Innerhalb von API-Routen und Route Handlern können Sie basierend auf der eingehenden Anfrage weiterleiten.
- Innerhalb von
getStaticProps
undgetServerSideProps
können Sie bestimmte Seiten zur Laufzeit weiterleiten.
Versionsverlauf
Version | Änderungen |
---|---|
v13.3.0 | missing hinzugefügt. |
v10.2.0 | has hinzugefügt. |
v9.5.0 | redirects hinzugefügt. |