Middleware
Middleware ermöglicht es Ihnen, Code auszuführen, bevor eine Anfrage abgeschlossen wird. Basierend auf der eingehenden Anfrage können Sie die Antwort ändern, indem Sie Folgendes durchführen: Umschreiben, Umleiten, Ändern der Anfrage- oder Antwortheader oder direkte Antwort.
Middleware wird ausgeführt, bevor zwischengespeicherte Inhalte und Routen abgeglichen werden. Weitere Details finden Sie unter Pfade abgleichen.
Anwendungsfälle
Die Integration von Middleware in Ihre Anwendung kann zu erheblichen Verbesserungen in Bezug auf Leistung, Sicherheit und Benutzererfahrung führen. Einige häufige Szenarien, in denen Middleware besonders effektiv ist, umfassen:
- Authentifizierung und Autorisierung: Stellen Sie die Benutzeridentität sicher und überprüfen Sie Sitzungs-Cookies, bevor Sie den Zugriff auf bestimmte Seiten oder API-Routen gewähren.
- Serverseitige Weiterleitungen: Leiten Sie Benutzer auf Serverebene basierend auf bestimmten Bedingungen weiter (z.B. Gebietsschema, Benutzerrolle).
- Pfad-Umschreibung: Unterstützen Sie A/B-Tests, Feature-Rollouts oder Legacy-Pfade durch dynamisches Umschreiben von Pfaden zu API-Routen oder Seiten basierend auf Anfrageeigenschaften.
- Bot-Erkennung: Schützen Sie Ihre Ressourcen durch Erkennung und Blockierung von Bot-Verkehr.
- Logging und Analyse: Erfassen und analysieren Sie Anfragedaten für Erkenntnisse, bevor sie von der Seite oder API verarbeitet werden.
- Feature-Flagging: Aktivieren oder deaktivieren Sie Features dynamisch für nahtlose Feature-Rollouts oder Tests.
Ebenso wichtig ist es, Situationen zu erkennen, in denen Middleware möglicherweise nicht der optimale Ansatz ist. Hier sind einige Szenarien, bei denen Sie vorsichtig sein sollten:
- Komplexe Datenabruf und -manipulation: Middleware ist nicht für direktes Datenabrufen oder -manipulieren konzipiert. Dies sollte stattdessen in Route Handlers oder serverseitigen Dienstprogrammen erfolgen.
- Rechenintensive Aufgaben: Middleware sollte leichtgewichtig sein und schnell reagieren, da es sonst zu Verzögerungen beim Seitenladen kommen kann. Rechenintensive Aufgaben oder Prozesse mit langer Laufzeit sollten in dedizierten Route Handlers durchgeführt werden.
- Umfangreiches Sitzungsmanagement: Während Middleware grundlegende Sitzungsaufgaben bewältigen kann, sollte ein umfangreiches Sitzungsmanagement von dedizierten Authentifizierungsdiensten oder in Route Handlers durchgeführt werden.
- Direkte Datenbankoperationen: Direkte Datenbankoperationen in der Middleware werden nicht empfohlen. Datenbankinteraktionen sollten in Route Handlers oder serverseitigen Dienstprogrammen erfolgen.
Konvention
Verwenden Sie die Datei middleware.ts
(oder .js
) im Stammverzeichnis Ihres Projekts, um Middleware zu definieren. Beispielsweise auf derselben Ebene wie pages
oder app
oder innerhalb von src
, falls zutreffend.
Hinweis: Obwohl nur eine
middleware.ts
-Datei pro Projekt unterstützt wird, können Sie Ihre Middleware-Logik dennoch modular organisieren. Lagern Sie Middleware-Funktionalitäten in separate.ts
- oder.js
-Dateien aus und importieren Sie sie in Ihre Haupt-middleware.ts
-Datei. Dies ermöglicht eine übersichtlichere Verwaltung von routenspezifischer Middleware, die in dermiddleware.ts
zusammengeführt wird, um eine zentrale Steuerung zu gewährleisten. Durch die Durchsetzung einer einzelnen Middleware-Datei wird die Konfiguration vereinfacht, potenzielle Konflikte werden vermieden und die Leistung wird durch die Vermeidung mehrerer Middleware-Ebenen optimiert.
Beispiel
Pfade abgleichen
Middleware wird für jede Route in Ihrem Projekt aufgerufen. Angesichts dessen ist es entscheidend, Matcher zu verwenden, um spezifische Routen präzise auszuwählen oder auszuschließen. Die folgende Reihenfolge wird ausgeführt:
headers
ausnext.config.js
redirects
ausnext.config.js
- Middleware (
rewrites
,redirects
usw.) beforeFiles
(rewrites
) ausnext.config.js
- Dateisystemrouten (
public/
,_next/static/
,pages/
,app/
usw.) afterFiles
(rewrites
) ausnext.config.js
- Dynamische Routen (
/blog/[slug]
) fallback
(rewrites
) ausnext.config.js
Es gibt zwei Möglichkeiten, zu definieren, auf welchen Pfaden Middleware ausgeführt wird:
Matcher
matcher
ermöglicht es Ihnen, Middleware so zu filtern, dass sie nur auf bestimmten Pfaden ausgeführt wird.
Sie können einen einzelnen Pfad oder mehrere Pfade mit einer Array-Syntax abgleichen:
Die matcher
-Konfiguration unterstützt vollständige Regex, sodass Matching wie negative Lookaheads oder Zeichenabgleich unterstützt werden. Ein Beispiel für einen negativen Lookahead zum Abgleichen aller Pfade außer bestimmten Pfaden finden Sie hier:
Sie können Middleware für bestimmte Anfragen auch umgehen, indem Sie die Arrays missing
oder has
oder eine Kombination von beiden verwenden:
Hinweis: Die
matcher
-Werte müssen Konstanten sein, damit sie zur Bauzeit statisch analysiert werden können. Dynamische Werte wie Variablen werden ignoriert.
Konfigurierte Matcher:
- MÜSSEN mit
/
beginnen - Können benannte Parameter enthalten:
/about/:path
passt auf/about/a
und/about/b
, aber nicht auf/about/a/c
- Können Modifikatoren für benannte Parameter haben (beginnend mit
:
):/about/:path*
passt auf/about/a/b/c
, da*
null oder mehr bedeutet.?
ist null oder eins und+
eins oder mehr - Können reguläre Ausdrücke in Klammern verwenden:
/about/(.*)
ist dasselbe wie/about/:path*
Weitere Details finden Sie in der path-to-regexp Dokumentation.
Hinweis: Aus Gründen der Abwärtskompatibilität betrachtet Next.js
/public
immer als/public/index
. Daher wird ein Matcher von/public/:path
übereinstimmen.
Bedingte Anweisungen
NextResponse
Die NextResponse
-API ermöglicht es Ihnen:
- Die eingehende Anfrage zu einer anderen URL umzuleiten (
redirect
) - Die Antwort umzuschreiben, indem eine bestimmte URL angezeigt wird (
rewrite
) - Anfrage-Header für API-Routen,
getServerSideProps
undrewrite
-Ziele zu setzen - Antwort-Cookies zu setzen
- Antwort-Header zu setzen
Um eine Antwort aus Middleware zu erzeugen, können Sie:
- Zu einer Route (
rewrite
) (Seite oder Routenhandler) wechseln, die eine Antwort erzeugt - Direkt eine
NextResponse
zurückgeben. Siehe Antwort erzeugen
Cookies verwenden
Cookies sind reguläre Header. Bei einer Request
werden sie im Cookie
-Header gespeichert. Bei einer Response
befinden sie sich im Set-Cookie
-Header. Next.js bietet eine bequeme Methode, diese Cookies über die cookies
-Erweiterung von NextRequest
und NextResponse
zu verwenden.
- Für eingehende Anfragen verfügt
cookies
über folgende Methoden:get
,getAll
,set
unddelete
von Cookies. Sie können das Vorhandensein eines Cookies mithas
überprüfen oder alle Cookies mitclear
entfernen. - Für ausgehende Antworten haben
cookies
folgende Methoden:get
,getAll
,set
unddelete
.
Header setzen
Sie können Anfrage- und Antwort-Header mithilfe der NextResponse
-API setzen (das Setzen von Anfrage-Headern ist seit Next.js v13.0.0 verfügbar).
Hinweis: Vermeiden Sie das Setzen großer Header, da dies je nach Konfiguration Ihres Backend-Webservers zu einem Fehler 431 Request Header Fields Too Large führen kann.
CORS
Sie können CORS-Header in Middleware setzen, um eingehende Anfragen von anderen Ursprüngen zu ermöglichen, einschließlich einfacher und vorausgeprüfter Anfragen.
Hinweis: Sie können CORS-Header für einzelne Routen in Route Handlers konfigurieren.
Eine Antwort erzeugen
Sie können direkt aus der Middleware eine Antwort zurückgeben, indem Sie eine Response
- oder NextResponse
-Instanz zurückgeben. (Dies ist seit Next.js v13.1.0 verfügbar)
waitUntil
und NextFetchEvent
Das NextFetchEvent
-Objekt erweitert das native FetchEvent
-Objekt und enthält die waitUntil()
-Methode.
Die waitUntil()
-Methode nimmt ein Promise als Argument und verlängert die Lebensdauer der Middleware, bis das Promise abgeschlossen ist. Dies ist nützlich, um Arbeiten im Hintergrund auszuführen.
Erweiterte Middleware-Flags
In Next.js v13.1
wurden zwei zusätzliche Flags für Middleware eingeführt: skipMiddlewareUrlNormalize
und skipTrailingSlashRedirect
, um fortgeschrittene Anwendungsfälle zu behandeln.
skipTrailingSlashRedirect
deaktiviert Next.js-Weiterleitungen zum Hinzufügen oder Entfernen von abschließenden Schrägstrichen. Dies ermöglicht eine benutzerdefinierte Behandlung in der Middleware, um abschließende Schrägstriche für einige Pfade, aber nicht für andere beizubehalten, was schrittweise Migrationen erleichtern kann.
skipMiddlewareUrlNormalize
ermöglicht das Deaktivieren der URL-Normalisierung in Next.js, um direkte Besuche und Client-Übergänge gleich zu behandeln. In einigen fortgeschrittenen Fällen bietet diese Option eine vollständige Kontrolle durch Verwendung der ursprünglichen URL.
Laufzeit
Middleware unterstützt derzeit nur mit der Edge-Laufzeit kompatible APIs. APIs, die ausschließlich zu Node.js gehören, werden nicht unterstützt.
Versionshistorie
Version | Änderungen |
---|---|
v13.1.0 | Erweiterte Middleware-Flags hinzugefügt |
v13.0.0 | Middleware kann Anfrage-Header, Antwort-Header ändern und Antworten senden |
v12.2.0 | Middleware ist stabil, bitte lesen Sie den Upgrade-Leitfaden |
v12.0.9 | Absolute URLs in Edge-Laufzeit erzwingen (PR) |
v12.0.0 | Middleware (Beta) hinzugefügt |