diff --git a/packages/next/server/base-server.ts b/packages/next/server/base-server.ts index 800f82d3ff6b3..7cbf14a08787b 100644 --- a/packages/next/server/base-server.ts +++ b/packages/next/server/base-server.ts @@ -1238,13 +1238,6 @@ export default abstract class Server { 'x-nextjs-matched-path', `${query.__nextLocale ? `/${query.__nextLocale}` : ''}${pathname}` ) - // return empty JSON when not an SSG/SSP page and not an error - if (!(isSSG || hasServerProps)) { - res.setHeader('content-type', 'application/json') - res.body('{}') - res.send() - return null - } } // Don't delete query.__flight__ yet, it still needs to be used in renderToHTML later @@ -1878,6 +1871,22 @@ export default abstract class Server { } return response } + + if ( + !!ctx.req.headers['x-nextjs-data'] && + (!res.statusCode || res.statusCode === 200 || res.statusCode === 404) + ) { + res.setHeader( + 'x-nextjs-matched-path', + `${query.__nextLocale ? `/${query.__nextLocale}` : ''}${pathname}` + ) + res.statusCode = 200 + res.setHeader('content-type', 'application/json') + res.body('{}') + res.send() + return null + } + res.statusCode = 404 return this.renderErrorToResponse(ctx, null) } diff --git a/packages/next/shared/lib/router/router.ts b/packages/next/shared/lib/router/router.ts index 9a1d792ef8794..2138fe652f612 100644 --- a/packages/next/shared/lib/router/router.ts +++ b/packages/next/shared/lib/router/router.ts @@ -2200,7 +2200,14 @@ function getMiddlewareData( ]).then(([pages, { __rewrites: rewrites }]: any) => { let as = parsedRewriteTarget.pathname - if (!rewriteHeader || isDynamicRoute(as)) { + if ( + isDynamicRoute(as) || + (!rewriteHeader && + pages.includes( + normalizeLocalePath(removeBasePath(as), options.router.locales) + .pathname + )) + ) { const parsedSource = getNextPathnameInfo( parseRelativeUrl(source).pathname, { parseData: true } diff --git a/test/e2e/middleware-general/test/index.test.ts b/test/e2e/middleware-general/test/index.test.ts index df2f322e9d25b..e8647008d7eaf 100644 --- a/test/e2e/middleware-general/test/index.test.ts +++ b/test/e2e/middleware-general/test/index.test.ts @@ -212,6 +212,18 @@ describe('Middleware Runtime', () => { expect(await browser.elementByCss('#as-path').text()).toBe('/rewrite-3') }) + it('should have correct route params for rewrite from config non-dynamic route', async () => { + const browser = await webdriver(next.url, '/') + await browser.eval('window.beforeNav = 1') + await browser.eval('window.next.router.push("/rewrite-1")') + + await check(() => browser.elementByCss('body').text(), /Hello World/) + + expect(await browser.eval('window.next.router.query')).toEqual({ + from: 'config', + }) + }) + it('should redirect the same for direct visit and client-transition', async () => { const res = await fetchViaHTTP( next.url,