So validieren Sie Locale-Parameter in URLs in Next.js (Pages Router) v16
Nicht unterstützte Locale-Codes elegant behandeln
Problem
Wenn Locale-Codes Teil der URL-Struktur werden, verwandeln sie sich in Benutzereingaben, die validiert werden müssen. Ein Besucher kann /xx/about oder /gibberish/contact genauso einfach eingeben wie ein gültiges Locale wie /en/about. Ohne Validierung kann die Anwendung abstürzen, fehlerhafte Inhalte anzeigen oder verwirrende Fehlermeldungen ausgeben. Benutzer, die auf ungültige Locale-URLs stoßen, benötigen einen klaren Weg nach vorne – entweder durch Weiterleitung zu einem gültigen Locale oder eine ordnungsgemäße „Nicht gefunden"-Antwort, die ihnen hilft zu verstehen, was schiefgelaufen ist.
Lösung
Validieren Sie eingehende Locale-Parameter gegen eine Liste unterstützter Locales, bevor die Anfrage die Seitenkomponenten erreicht. Verwenden Sie Next.js-Middleware, um Anfragen abzufangen, zu prüfen, ob das Locale in der URL mit einem unterstützten Wert übereinstimmt, und entsprechend zu reagieren. Bei ungültigen Locales leiten Sie den Benutzer zum Standard-Locale weiter oder schreiben Sie die Anfrage um, um eine 404-Seite anzuzeigen. Dies stellt sicher, dass nur gültige Locale-Codes zur Darstellung von Inhalten fortfahren, während ungültige Codes elegant behandelt werden, ohne die Benutzererfahrung zu beeinträchtigen.
Schritte
1. Unterstützte Locales in der Next.js-Konfiguration definieren
Konfigurieren Sie die i18n-Einstellungen in next.config.js, um zu deklarieren, welche Locales Ihre Anwendung unterstützt und welches Locale als Standard dient.
module.exports = {
i18n: {
locales: ["en", "fr", "de"],
defaultLocale: "en",
localeDetection: false,
},
};
Das Setzen von localeDetection auf false verhindert automatische Weiterleitungen basierend auf Browser-Präferenzen und gibt Ihnen die volle Kontrolle über die Locale-Behandlung.
2. Middleware zur Validierung von Locale-Parametern erstellen
Erstellen Sie eine middleware.ts-Datei im Stammverzeichnis Ihres Projekts oder im src-Ordner, falls Sie einen verwenden.
import { NextRequest, NextResponse } from "next/server";
const SUPPORTED_LOCALES = ["en", "fr", "de"];
const DEFAULT_LOCALE = "en";
export function middleware(request: NextRequest) {
const { pathname } = request.nextUrl;
const pathnameHasLocale = SUPPORTED_LOCALES.some(
(locale) => pathname.startsWith(`/${locale}/`) || pathname === `/${locale}`,
);
if (!pathnameHasLocale) {
return;
}
const localeInPath = pathname.split("/")[1];
if (!SUPPORTED_LOCALES.includes(localeInPath)) {
const url = request.nextUrl.clone();
url.pathname = pathname.replace(`/${localeInPath}`, `/${DEFAULT_LOCALE}`);
return NextResponse.redirect(url);
}
}
export const config = {
matcher: ["/((?!_next|api|favicon.ico|.*\\..*).*)"],
};
Die Middleware extrahiert die Locale aus dem URL-Pfad, prüft sie gegen das Array der unterstützten Locales und leitet ungültige Locales zur Standard-Locale um, während der Rest des Pfads erhalten bleibt.
3. Ungültige Locales mit einer 404-Antwort behandeln
Wenn Sie lieber eine 404-Seite anzeigen möchten, anstatt umzuleiten, schreiben Sie die Anfrage auf die benutzerdefinierte 404-Seite um.
import { NextRequest, NextResponse } from "next/server";
const SUPPORTED_LOCALES = ["en", "fr", "de"];
export function middleware(request: NextRequest) {
const { pathname } = request.nextUrl;
const pathnameHasLocale = SUPPORTED_LOCALES.some(
(locale) => pathname.startsWith(`/${locale}/`) || pathname === `/${locale}`,
);
if (!pathnameHasLocale) {
return;
}
const localeInPath = pathname.split("/")[1];
if (!SUPPORTED_LOCALES.includes(localeInPath)) {
const url = request.nextUrl.clone();
url.pathname = "/404";
return NextResponse.rewrite(url);
}
}
export const config = {
matcher: ["/((?!_next|api|favicon.ico|.*\\..*).*)"],
};
Erstellen Sie eine benutzerdefinierte 404-Seite unter pages/404.js, die zur Build-Zeit statisch generiert wird.
4. Eine benutzerdefinierte 404-Seite erstellen
export default function Custom404() {
return (
<div>
<h1>404 - Page Not Found</h1>
<p>The page you are looking for does not exist.</p>
</div>
);
}
Diese Seite wird angezeigt, wenn die Middleware ungültige Locale-Anfragen umschreibt, und bietet Benutzern eine klare Meldung, dass die angeforderte URL nicht verfügbar ist.