Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: adds search params to multisite rewrite in appMiddleware #874

Merged
merged 6 commits into from
Dec 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/orange-shirts-relax.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@headstartwp/next": patch
---

Ensure query string is appended to URL rewrite/redirect in middleware
55 changes: 55 additions & 0 deletions packages/next/src/middlewares/__tests__/appMiddleware.ts
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,51 @@ describe('appMiddleware', () => {
expect(res.headers.get('x-headstartwp-locale')).toBe('pt');
});

it('[multisite] supports query strings in App and Pages router', async () => {
setHeadstartWPConfig({
sites: [
{
sourceUrl: 'http://testwp.com',
hostUrl: 'http://test.com',
},
{
sourceUrl: 'http://testwp2.com',
hostUrl: 'http://test2.com',
},
{
sourceUrl: 'http://testwp2.com/en',
hostUrl: 'http://test2.com',
},
],
});

// App Router
let req = new NextRequest('http://test2.com/post-name?s=search-slug', {
method: 'GET',
});

req.headers.set('host', 'test2.com');

let res = await AppMiddleware(req, { appRouter: true });

expect(res.headers.get('x-middleware-rewrite')).toBe(
'http://test2.com/test2.com/post-name?s=search-slug',
);

// Pages Router
req = new NextRequest('http://test2.com/post-name?s=search-slug', {
method: 'GET',
});

req.headers.set('host', 'test2.com');

res = await AppMiddleware(req, { appRouter: false });

expect(res.headers.get('x-middleware-rewrite')).toBe(
'http://test2.com/_sites/test2.com/post-name?s=search-slug',
);
});

it('[polylang] supports locales with app router', async () => {
setHeadstartWPConfig({
sourceUrl: 'http://testwp.com',
Expand Down Expand Up @@ -343,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
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 () => {
Expand Down
20 changes: 13 additions & 7 deletions packages/next/src/middlewares/appMidleware.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ export async function AppMiddleware(
options: AppMidlewareOptions = { appRouter: false },
) {
let response = NextResponse.next();
const { pathname } = req.nextUrl;
const { pathname, searchParams } = req.nextUrl;

if (isStaticAssetRequest(req) || isInternalRequest(req)) {
return response;
Expand All @@ -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,
Expand Down Expand Up @@ -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
Expand All @@ -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,
),
);
Expand All @@ -191,10 +197,10 @@ export async function AppMiddleware(

if (isMultisiteRequest && !shouldRedirect) {
const hostNameOrSlug = site.slug || hostname;
const pagesRouterRewrite = `/_sites/${hostNameOrSlug}${pathname}`;
const pagesRouterRewrite = `/_sites/${hostNameOrSlug}${pathname}${queryString}`;
const appRouterRewrite = locale
? `/${locale}/${hostNameOrSlug}${pathname.replace(`/${locale}`, '')}`
: `/${hostNameOrSlug}${pathname}`;
? `/${locale}/${hostNameOrSlug}${pathname.replace(`/${locale}`, '')}${queryString}`
: `/${hostNameOrSlug}${pathname}${queryString}`;

response = NextResponse.rewrite(
new URL(options.appRouter ? appRouterRewrite : pagesRouterRewrite, req.nextUrl),
Expand Down
Loading