diff --git a/packages/next/shared/lib/router/router.ts b/packages/next/shared/lib/router/router.ts index 0c48c76398ec..331870a5e1e0 100644 --- a/packages/next/shared/lib/router/router.ts +++ b/packages/next/shared/lib/router/router.ts @@ -1747,7 +1747,10 @@ export default class Router implements BaseRouter { route = removeTrailingSlash(data.effect.resolvedHref) pathname = data.effect.resolvedHref query = { ...query, ...data.effect.parsedAs.query } - resolvedAs = data.effect.parsedAs.pathname + resolvedAs = removeBasePath( + normalizeLocalePath(data.effect.parsedAs.pathname, this.locales) + .pathname + ) // Check again the cache with the new destination. existingInfo = this.components[route] @@ -1806,20 +1809,24 @@ export default class Router implements BaseRouter { const { props } = await this._getData(async () => { if (shouldFetchData && !useStreamedFlightData) { const { json } = - data || - (await fetchNextData({ - dataHref: this.pageLoader.getDataHref({ - href: formatWithValidation({ pathname, query }), - asPath: resolvedAs, - locale, - }), - isServerRender: this.isSsr, - parseJSON: true, - inflightCache: this.sdc, - persistCache: !isPreview, - isPrefetch: false, - unstable_skipClientCache, - })) + data?.json && + data?.response.headers + .get('content-type') + ?.includes('application/json') + ? data + : await fetchNextData({ + dataHref: this.pageLoader.getDataHref({ + href: formatWithValidation({ pathname, query }), + asPath: resolvedAs, + locale, + }), + isServerRender: this.isSsr, + parseJSON: true, + inflightCache: this.sdc, + persistCache: !isPreview, + isPrefetch: false, + unstable_skipClientCache, + }) return { props: json, diff --git a/test/e2e/middleware-rewrites/app/next.config.js b/test/e2e/middleware-rewrites/app/next.config.js index 80afb868a906..32c5d38016b0 100644 --- a/test/e2e/middleware-rewrites/app/next.config.js +++ b/test/e2e/middleware-rewrites/app/next.config.js @@ -16,6 +16,10 @@ module.exports = { source: '/afterfiles-rewrite', destination: '/ab-test/b', }, + { + source: '/afterfiles-rewrite-ssg', + destination: '/fallback-true-blog/first', + }, ], fallback: [], } diff --git a/test/e2e/middleware-rewrites/test/index.test.ts b/test/e2e/middleware-rewrites/test/index.test.ts index bf2420cc601c..d3b33f437ee0 100644 --- a/test/e2e/middleware-rewrites/test/index.test.ts +++ b/test/e2e/middleware-rewrites/test/index.test.ts @@ -27,6 +27,30 @@ describe('Middleware Rewrite', () => { testsWithLocale('/fr') function tests() { + it('should have props for afterFiles rewrite to SSG page', async () => { + let browser = await webdriver(next.url, '/') + await browser.eval(`next.router.push("/afterfiles-rewrite-ssg")`) + + await check( + () => browser.eval('next.router.isReady ? "yup": "nope"'), + 'yup' + ) + await check( + () => browser.eval('document.documentElement.innerHTML'), + /"slug":"first"/ + ) + + browser = await webdriver(next.url, '/afterfiles-rewrite-ssg') + await check( + () => browser.eval('next.router.isReady ? "yup": "nope"'), + 'yup' + ) + await check( + () => browser.eval('document.documentElement.innerHTML'), + /"slug":"first"/ + ) + }) + it('should hard navigate on 404 for data request', async () => { const browser = await webdriver(next.url, '/') await browser.eval('window.beforeNav = 1')