From f29c80ace54fd0fcd9cae5b92c4ab6194ebef23d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Antunes?= Date: Mon, 16 Feb 2026 16:13:54 -0300 Subject: [PATCH] fix(nextjs): prevent infinite handshake redirect loop on Netlify --- .changeset/public-emus-stay.md | 5 +++++ packages/nextjs/src/server/clerkMiddleware.ts | 9 ++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 .changeset/public-emus-stay.md diff --git a/.changeset/public-emus-stay.md b/.changeset/public-emus-stay.md new file mode 100644 index 00000000000..22698bf9f75 --- /dev/null +++ b/.changeset/public-emus-stay.md @@ -0,0 +1,5 @@ +--- +'@clerk/nextjs': patch +--- + +Fix infinite handshake redirect loop when deploying Next.js apps with Clerk development instances to Netlify diff --git a/packages/nextjs/src/server/clerkMiddleware.ts b/packages/nextjs/src/server/clerkMiddleware.ts index f1f2bb5ff7b..c50949ef99f 100644 --- a/packages/nextjs/src/server/clerkMiddleware.ts +++ b/packages/nextjs/src/server/clerkMiddleware.ts @@ -22,6 +22,7 @@ import { } from '@clerk/backend/internal'; import { clerkFrontendApiProxy, DEFAULT_PROXY_PATH, matchProxyPath } from '@clerk/backend/proxy'; import { parsePublishableKey } from '@clerk/shared/keys'; +import { handleNetlifyCacheInDevInstance } from '@clerk/shared/netlifyCacheHandler'; import { notFound as nextjsNotFound } from 'next/navigation'; import type { NextMiddleware, NextRequest } from 'next/server'; import { NextResponse } from 'next/server'; @@ -222,7 +223,13 @@ export const clerkMiddleware = ((...args: unknown[]): NextMiddleware | NextMiddl const locationHeader = requestState.headers.get(constants.Headers.Location); if (locationHeader) { - const res = NextResponse.redirect(locationHeader); + handleNetlifyCacheInDevInstance({ + locationHeader, + requestStateHeaders: requestState.headers, + publishableKey: requestState.publishableKey, + }); + + const res = NextResponse.redirect(requestState.headers.get(constants.Headers.Location) || locationHeader); requestState.headers.forEach((value, key) => { if (key === constants.Headers.Location) { return;