From 91684eeab82ddea2ebdfbdc229166e2f4d040b50 Mon Sep 17 00:00:00 2001 From: Hendrik Liebau Date: Wed, 26 Feb 2025 20:31:26 +0100 Subject: [PATCH] Remove rewrite query params from request URL when deployed to Vercel (#76548) --- packages/next/src/server/server-utils.ts | 9 ++++----- test/e2e/getserversideprops/app/next.config.js | 4 ++++ test/e2e/getserversideprops/app/pages/index.js | 2 ++ .../app/pages/rewrite-target/index.js | 17 +++++++++++++++++ test/e2e/getserversideprops/test/index.test.ts | 13 +++++++++++++ 5 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 test/e2e/getserversideprops/app/pages/rewrite-target/index.js diff --git a/packages/next/src/server/server-utils.ts b/packages/next/src/server/server-utils.ts index e8ad3fac9fd97..a9d41354224c6 100644 --- a/packages/next/src/server/server-utils.ts +++ b/packages/next/src/server/server-utils.ts @@ -27,10 +27,8 @@ export function normalizeVercelUrl( paramKeys: string[], defaultRouteRegex: ReturnType | undefined ) { - if (!defaultRouteRegex) return - - // make sure to normalize req.url on Vercel to strip dynamic params - // from the query which are added during routing + // make sure to normalize req.url on Vercel to strip dynamic and rewrite + // params from the query which are added during routing const _parsedUrl = parseUrl(req.url!, true) delete (_parsedUrl as any).search @@ -45,7 +43,8 @@ export function normalizeVercelUrl( if ( isNextQueryPrefix || isNextInterceptionMarkerPrefix || - (paramKeys || Object.keys(defaultRouteRegex.groups)).includes(key) + paramKeys.includes(key) || + (defaultRouteRegex && Object.keys(defaultRouteRegex.groups).includes(key)) ) { delete _parsedUrl.query[key] } diff --git a/test/e2e/getserversideprops/app/next.config.js b/test/e2e/getserversideprops/app/next.config.js index ac7d2bcaf0a93..ef7ab634dc3fc 100644 --- a/test/e2e/getserversideprops/app/next.config.js +++ b/test/e2e/getserversideprops/app/next.config.js @@ -14,6 +14,10 @@ module.exports = { source: '/blog-:param', destination: '/blog/post-3', }, + { + source: '/rewrite-source/:path+', + destination: '/rewrite-target', + }, ] }, } diff --git a/test/e2e/getserversideprops/app/pages/index.js b/test/e2e/getserversideprops/app/pages/index.js index cb0367080de5d..f58eef648868f 100644 --- a/test/e2e/getserversideprops/app/pages/index.js +++ b/test/e2e/getserversideprops/app/pages/index.js @@ -95,6 +95,8 @@ const Page = ({ world, time, url }) => {
to redirect-page +
+ to rewrite-source/foo ) } diff --git a/test/e2e/getserversideprops/app/pages/rewrite-target/index.js b/test/e2e/getserversideprops/app/pages/rewrite-target/index.js new file mode 100644 index 0000000000000..d74fbbd7458aa --- /dev/null +++ b/test/e2e/getserversideprops/app/pages/rewrite-target/index.js @@ -0,0 +1,17 @@ +import { useRouter } from 'next/router' + +export async function getServerSideProps({ req }) { + return { props: { url: req.url } } +} + +export default function RewriteTarget({ url }) { + const router = useRouter() + + return ( + <> +

rewrite-target

+

{router.asPath}

+

{url}

+ + ) +} diff --git a/test/e2e/getserversideprops/test/index.test.ts b/test/e2e/getserversideprops/test/index.test.ts index b0957855a4ae0..9f9593d848067 100644 --- a/test/e2e/getserversideprops/test/index.test.ts +++ b/test/e2e/getserversideprops/test/index.test.ts @@ -169,6 +169,12 @@ const expectedManifestRoutes = () => [ ), page: '/refresh', }, + { + dataRouteRegex: normalizeRegEx( + `^\\/_next\\/data\\/${escapeRegex(buildId)}\\/rewrite-target\\.json$` + ), + page: '/rewrite-target', + }, { dataRouteRegex: normalizeRegEx( `^\\/_next\\/data\\/${escapeRegex(buildId)}\\/slow\\.json$` @@ -543,6 +549,13 @@ const runTests = (isDev = false, isDeploy = false) => { expect($('#as-path').text()).toBe('/something') }) + it('should not include rewrite query params in `asPath` and `req.url`', async () => { + const $ = await next.render$('/rewrite-source/foo') + expect($('h1').text()).toBe('rewrite-target') + expect($('#as-path').text()).toBe('/rewrite-source/foo') + expect($('#req-url').text()).toBe('/rewrite-source/foo') + }) + it('should return data correctly', async () => { const data = JSON.parse( await renderViaHTTP(next.url, `/_next/data/${buildId}/something.json`)