fix: Weiterleitungen innerhalb der Seite relativ statt auf die Produktionsdomain
Sechs Route-Handler (Hinweis-Weiterleitung, E-Mail-Bestaetigung, Newsletter bestaetigen/abmelden, Entra-Login und -Callback) bauten ihr Weiterleitungsziel mit getBaseUrl() absolut zusammen. Ohne gesetztes NEXT_PUBLIC_SITE_URL (lokal, Staging, Vorschau-Host) sprang man damit auf https://wabenhain.com, und die gerade gesetzte Flash-Meldung ging auf dem fremden Host verloren - aufgefallen, als die Admin-Pruefung nach /api/hinweis umleitete. Neuer Helfer lib/redirect.ts (redirectWithinSite) mit relativem Location-Header, analog zu redirect() in Server Actions. Er lehnt alles ausser Pfaden dieser Seite ab ("//host", "/\host", absolute URLs), damit daraus keine offene Weiterleitung werden kann. getSiteUrl() bleibt fuer Adressen, die die Seite verlassen (E-Mails, Stripe, Entra-redirect_uri, Sitemap, Canonicals). proxy.ts bleibt bei new URL("/konto", request.url) (eigener Host): der Proxy verlangt einen absoluten Location-Header, ein relativer endet dort in "Invalid URL" - als Kommentar festgehalten. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
1 parent
4f442ec06d
commit
52ce37e216
9 files changed
+76
-29
No files matched your search
@@ -1,19 +1,17 @@
|
||||
import { NextResponse } from "next/server";
|
||||
import { prisma } from "@/lib/prisma";
|
||||
import { getBaseUrl } from "@/lib/url";
|
||||
import { ensureNewsletterDiscountCode } from "@/lib/newsletter-discount";
|
||||
import { redirectWithinSite } from "@/lib/redirect";
|
||||
|
||||
export async function GET(request: Request) {
|
||||
const token = new URL(request.url).searchParams.get("token");
|
||||
const baseUrl = getBaseUrl();
|
||||
|
||||
if (!token) {
|
||||
return NextResponse.redirect(`${baseUrl}/newsletter-bestaetigt?status=invalid`);
|
||||
return redirectWithinSite("/newsletter-bestaetigt?status=invalid");
|
||||
}
|
||||
|
||||
const subscriber = await prisma.newsletterSubscriber.findUnique({ where: { confirmationToken: token } });
|
||||
if (!subscriber) {
|
||||
return NextResponse.redirect(`${baseUrl}/newsletter-bestaetigt?status=invalid`);
|
||||
return redirectWithinSite("/newsletter-bestaetigt?status=invalid");
|
||||
}
|
||||
|
||||
await prisma.newsletterSubscriber.update({
|
||||
@@ -22,5 +20,5 @@ export async function GET(request: Request) {
|
||||
});
|
||||
await ensureNewsletterDiscountCode();
|
||||
|
||||
return NextResponse.redirect(`${baseUrl}/newsletter-bestaetigt?status=ok`);
|
||||
return redirectWithinSite("/newsletter-bestaetigt?status=ok");
|
||||
}
|
||||
Reference in new issue
Block a user