diff --git a/packages/next/export/worker.ts b/packages/next/export/worker.ts index 180def8d1cd2..dca36f816615 100644 --- a/packages/next/export/worker.ts +++ b/packages/next/export/worker.ts @@ -215,8 +215,8 @@ export default async function exportPage({ subFolders ? `${_path}${sep}index.html` : `${_path}.html` let htmlFilename = getHtmlFilename(filePath) - const pageExt = extname(page) - const pathExt = extname(path) + const pageExt = isDynamic ? '' : extname(page) + const pathExt = isDynamic ? '' : extname(path) // Make sure page isn't a folder with a dot in the name e.g. `v1.2` if (pageExt !== pathExt && pathExt !== '') { const isBuiltinPaths = ['/500', '/404'].some( diff --git a/packages/next/server/denormalize-page-path.ts b/packages/next/server/denormalize-page-path.ts index 39ba36212f69..e3e2f1bcecd0 100644 --- a/packages/next/server/denormalize-page-path.ts +++ b/packages/next/server/denormalize-page-path.ts @@ -1,10 +1,12 @@ +import { isDynamicRoute } from '../shared/lib/router/utils' + export function normalizePathSep(path: string): string { return path.replace(/\\/g, '/') } export function denormalizePagePath(page: string) { page = normalizePathSep(page) - if (page.startsWith('/index/')) { + if (page.startsWith('/index/') && !isDynamicRoute(page)) { page = page.slice(6) } else if (page === '/index') { page = '/' diff --git a/packages/next/server/normalize-page-path.ts b/packages/next/server/normalize-page-path.ts index 95e8d9a596c6..0c25c4ad1f3f 100644 --- a/packages/next/server/normalize-page-path.ts +++ b/packages/next/server/normalize-page-path.ts @@ -6,7 +6,7 @@ export function normalizePagePath(page: string): string { // If the page is `/` we need to append `/index`, otherwise the returned directory root will be bundles instead of pages if (page === '/') { page = '/index' - } else if (/^\/index(\/|$)/.test(page)) { + } else if (/^\/index(\/|$)$/.test(page)) { page = `/index${page}` } // Resolve on anything that doesn't start with `/` diff --git a/packages/next/shared/lib/router/utils/get-route-from-asset-path.ts b/packages/next/shared/lib/router/utils/get-route-from-asset-path.ts index 495865e56876..b738e75c74f0 100644 --- a/packages/next/shared/lib/router/utils/get-route-from-asset-path.ts +++ b/packages/next/shared/lib/router/utils/get-route-from-asset-path.ts @@ -1,4 +1,7 @@ // Translate a pages asset path (relative from a common prefix) back into its logical route + +import { isDynamicRoute } from './is-dynamic' + // "asset path" being its javascript file, data file, prerendered html,... export default function getRouteFromAssetPath( assetPath: string, @@ -7,7 +10,7 @@ export default function getRouteFromAssetPath( assetPath = assetPath.replace(/\\/g, '/') assetPath = ext && assetPath.endsWith(ext) ? assetPath.slice(0, -ext.length) : assetPath - if (assetPath.startsWith('/index/')) { + if (assetPath.startsWith('/index/') && !isDynamicRoute(assetPath)) { assetPath = assetPath.slice(6) } else if (assetPath === '/index') { assetPath = '/' diff --git a/test/integration/dynamic-routing/pages/index/[...slug].js b/test/integration/dynamic-routing/pages/index/[...slug].js new file mode 100644 index 000000000000..0688517139fd --- /dev/null +++ b/test/integration/dynamic-routing/pages/index/[...slug].js @@ -0,0 +1,3 @@ +export default function page() { + return 'index/[...slug]' +}