From 4c8ee34888751854fe3ffddefd6f63ba7003f222 Mon Sep 17 00:00:00 2001 From: Jacob Dubail Date: Thu, 12 Dec 2024 13:02:15 -0800 Subject: [PATCH] feat: add query string for locale rewrites in middleware. add tests --- .../src/middlewares/__tests__/appMiddleware.ts | 10 ++++++++++ packages/next/src/middlewares/appMidleware.ts | 15 +++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/packages/next/src/middlewares/__tests__/appMiddleware.ts b/packages/next/src/middlewares/__tests__/appMiddleware.ts index 9a995da50..b062ffd76 100644 --- a/packages/next/src/middlewares/__tests__/appMiddleware.ts +++ b/packages/next/src/middlewares/__tests__/appMiddleware.ts @@ -388,6 +388,16 @@ describe('appMiddleware', () => { res = await AppMiddleware(req, { appRouter: true }); expect(res.headers.get('x-middleware-rewrite')).toBe('http://test.com/en/post-name'); + + // add default locale with a query string, expecting this to fail + req = new NextRequest('http://test.com/post-name?s=query', { + method: 'GET', + }); + + res = await AppMiddleware(req, { appRouter: true }); + expect(res.headers.get('x-middleware-rewrite')).toBe( + 'http://test.com/en/post-name?s=query', + ); }); it('[polylang no locale detection] supports locales with app router', async () => { diff --git a/packages/next/src/middlewares/appMidleware.ts b/packages/next/src/middlewares/appMidleware.ts index b96af6d99..94effaebf 100644 --- a/packages/next/src/middlewares/appMidleware.ts +++ b/packages/next/src/middlewares/appMidleware.ts @@ -120,6 +120,9 @@ export async function AppMiddleware( const site = getSiteByHost(hostname, !hasPolylangIntegration ? locale : undefined); const isMultisiteRequest = site !== null && typeof site.sourceUrl !== 'undefined'; + // ensure we re-add the query string when rewriting/redirecing + const queryString = Array.from(searchParams.keys()).length ? `?${searchParams.toString()}` : ''; + const { redirectStrategy, sourceUrl, @@ -161,7 +164,7 @@ export async function AppMiddleware( shouldRedirect = true; const pathNameWithoutLocale = pathname.replace(`/${locale}`, ''); response = NextResponse.redirect( - new URL(pathNameWithoutLocale, req.url.replace(`/${locale}`, '')), + new URL(pathNameWithoutLocale + queryString, req.url.replace(`/${locale}`, '')), ); } // if we detected a non-default locale, there isn't a supported locale in the URL already @@ -175,14 +178,17 @@ export async function AppMiddleware( ) { shouldRedirect = true; response = NextResponse.redirect( - new URL(`/${locale}${pathname.startsWith('/') ? '' : '/'}${pathname}`, req.url), + new URL( + `/${locale}${pathname.startsWith('/') ? '' : '/'}${pathname}${queryString}`, + req.url, + ), ); } // nothing else and there's not a locale in path then rewrite to add default locale else if (pathnameIsMissingLocale && !isValidLocale(firstPathSlice)) { response = NextResponse.rewrite( new URL( - `/${defaultAppRouterLocale}${pathname.startsWith('/') ? '' : '/'}${pathname}`, + `/${defaultAppRouterLocale}${pathname.startsWith('/') ? '' : '/'}${pathname}${queryString}`, req.url, ), ); @@ -191,9 +197,6 @@ export async function AppMiddleware( if (isMultisiteRequest && !shouldRedirect) { const hostNameOrSlug = site.slug || hostname; - const queryString = Array.from(searchParams.keys()).length - ? `?${searchParams.toString()}` - : ''; const pagesRouterRewrite = `/_sites/${hostNameOrSlug}${pathname}${queryString}`; const appRouterRewrite = locale ? `/${locale}/${hostNameOrSlug}${pathname.replace(`/${locale}`, '')}${queryString}`