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;