Skip to content

Commit c78e042

Browse files
committed
fix: preserve original path after middleware rewrite
1 parent 2b5b6f8 commit c78e042

File tree

3 files changed

+18
-1
lines changed

3 files changed

+18
-1
lines changed

packages/runtime/src/templates/edge-shared/utils.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,9 @@ export const buildResponse = async ({
270270
}
271271
res.headers.set('x-middleware-rewrite', relativeUrl)
272272

273+
request.headers.set('x-original-path', new URL(request.url, `http://n`).pathname)
274+
request.headers.set('x-middleware-rewrite', rewrite)
275+
273276
return addMiddlewareHeaders(context.rewrite(rewrite), res)
274277
}
275278

packages/runtime/src/templates/handlerUtils.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,13 @@ export const normalizePath = (event: HandlerEvent) => {
189189
return originalPath
190190
}
191191
}
192+
193+
if (event.headers['x-original-path']) {
194+
if (event.headers['x-next-debug-logging']) {
195+
console.log('Original path:', event.headers['x-original-path'])
196+
}
197+
return event.headers['x-original-path']
198+
}
192199
// Ensure that paths are encoded - but don't double-encode them
193200
return new URL(event.rawUrl).pathname
194201
}

packages/runtime/src/templates/server.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
import { PrerenderManifest } from 'next/dist/build'
1+
// eslint-disable-next-line n/no-deprecated-api -- this is what Next.js uses as well
2+
import { parse } from 'url'
3+
4+
import type { PrerenderManifest } from 'next/dist/build'
25
import type { BaseNextResponse } from 'next/dist/server/base-http'
36
import type { NodeRequestHandler, Options } from 'next/dist/server/next-server'
47

@@ -36,6 +39,10 @@ const getNetlifyNextServer = (NextServer: NextServerType) => {
3639
public getRequestHandler(): NodeRequestHandler {
3740
const handler = super.getRequestHandler()
3841
return async (req, res, parsedUrl) => {
42+
if (!parsedUrl && typeof req?.headers?.['x-middleware-rewrite'] === 'string') {
43+
parsedUrl = parse(req.headers['x-middleware-rewrite'], true)
44+
}
45+
3946
// preserve the URL before Next.js mutates it for i18n
4047
const { url, headers } = req
4148

0 commit comments

Comments
 (0)