diff --git a/packages/next/build/index.ts b/packages/next/build/index.ts index 5f63699f480dfb0..bae3d706a98f28d 100644 --- a/packages/next/build/index.ts +++ b/packages/next/build/index.ts @@ -761,6 +761,7 @@ export default async function build( header: typeof RSC varyHeader: typeof RSC_VARY_HEADER } + skipMiddlewareUrlNormalize?: boolean } = nextBuildSpan.traceChild('generate-routes-manifest').traceFn(() => { const sortedRoutes = getSortedRoutes([ ...pageKeys.pages, @@ -791,6 +792,8 @@ export default async function build( header: RSC, varyHeader: RSC_VARY_HEADER, }, + skipMiddlewareUrlNormalize: + config.experimental.skipMiddlewareUrlNormalize, } }) diff --git a/test/e2e/skip-trailing-slash-redirect/app/middleware.js b/test/e2e/skip-trailing-slash-redirect/app/middleware.js index a92b36d5f3987f2..bc28d0ae4770cca 100644 --- a/test/e2e/skip-trailing-slash-redirect/app/middleware.js +++ b/test/e2e/skip-trailing-slash-redirect/app/middleware.js @@ -1,16 +1,25 @@ import { NextResponse } from 'next/server' export default function handler(req) { + console.log(req.nextUrl) + if (req.nextUrl.pathname.startsWith('/_next/data/missing-id')) { console.log(`missing-id rewrite: ${req.nextUrl.toString()}`) return NextResponse.rewrite('https://example.vercel.sh') } - if (req.nextUrl.pathname === '/middleware-rewrite-with-slash') { + if ( + req.nextUrl.pathname.startsWith('/_next/data') && + req.nextUrl.pathname.endsWith('valid.json') + ) { + return NextResponse.rewrite('https://example.vercel.sh') + } + + if (req.nextUrl.pathname.includes('/middleware-rewrite-with-slash')) { return NextResponse.rewrite(new URL('/another/', req.nextUrl)) } - if (req.nextUrl.pathname === '/middleware-rewrite-without-slash') { + if (req.nextUrl.pathname.includes('/middleware-rewrite-without-slash')) { return NextResponse.rewrite(new URL('/another', req.nextUrl)) } diff --git a/test/e2e/skip-trailing-slash-redirect/index.test.ts b/test/e2e/skip-trailing-slash-redirect/index.test.ts index 76b54feb80fd34d..e31d7a6909fc631 100644 --- a/test/e2e/skip-trailing-slash-redirect/index.test.ts +++ b/test/e2e/skip-trailing-slash-redirect/index.test.ts @@ -35,6 +35,21 @@ describe('skip-trailing-slash-redirect', () => { } }) + it('should provide original _next/data URL with skipMiddlewareUrlNormalize', async () => { + const res = await fetchViaHTTP( + next.url, + `/_next/data/${next.buildId}/valid.json`, + undefined, + { + headers: { + 'x-nextjs-data': '1', + }, + } + ) + expect(res.status).toBe(200) + expect(await res.text()).toContain('Example Domain') + }) + it('should allow response body from middleware with flag', async () => { const res = await fetchViaHTTP(next.url, '/middleware-response-body') expect(res.status).toBe(200) @@ -88,7 +103,7 @@ describe('skip-trailing-slash-redirect', () => { it('should correct skip URL normalizing in middleware', async () => { let res = await fetchViaHTTP( next.url, - '/middleware-rewrite-with-slash', + `/_next/data/${next.buildId}/middleware-rewrite-with-slash.json`, undefined, { redirect: 'manual', headers: { 'x-nextjs-data': '1' } } ) @@ -96,7 +111,7 @@ describe('skip-trailing-slash-redirect', () => { res = await fetchViaHTTP( next.url, - '/middleware-rewrite-without-slash', + `/_next/data/${next.buildId}/middleware-rewrite-without-slash.json`, undefined, { redirect: 'manual', headers: { 'x-nextjs-data': '1' } } )