diff --git a/crates/next-core/src/app_page_loader_tree.rs b/crates/next-core/src/app_page_loader_tree.rs index b991a5205291d..40d553f8f202e 100644 --- a/crates/next-core/src/app_page_loader_tree.rs +++ b/crates/next-core/src/app_page_loader_tree.rs @@ -133,11 +133,18 @@ impl AppPageLoaderTreeBuilder { return Ok(()); }; - let manifest_route = &format!("/{}", get_metadata_route_name(manifest).await?); + let metadata_manifest_route = get_metadata_route_name(manifest).await?; + // prefix with base_path if it exists + let manifest_route = if let Some(base_path) = &self.base_path { + format!("{}/{}", base_path, metadata_manifest_route) + } else { + metadata_manifest_route.to_string() + }; + writeln!( self.loader_tree_code, " manifest: {},", - StringifyJs(manifest_route) + StringifyJs(&manifest_route) )?; Ok(()) diff --git a/packages/next/src/build/webpack/loaders/metadata/discover.ts b/packages/next/src/build/webpack/loaders/metadata/discover.ts index 74d0403ed6d2d..f871fe2f22b75 100644 --- a/packages/next/src/build/webpack/loaders/metadata/discover.ts +++ b/packages/next/src/build/webpack/loaders/metadata/discover.ts @@ -86,7 +86,9 @@ export async function createStaticMetadataFromRoute( const extension = staticManifestExtension.includes(ext.slice(1)) ? ext.slice(1) : 'webmanifest' - staticImagesMetadata.manifest = JSON.stringify(`/${name}.${extension}`) + staticImagesMetadata.manifest = JSON.stringify( + `${basePath}/${name}.${extension}` + ) } return } diff --git a/packages/next/src/lib/metadata/resolvers/resolve-url.ts b/packages/next/src/lib/metadata/resolvers/resolve-url.ts index 32c20c90291b4..14984b6a28fff 100644 --- a/packages/next/src/lib/metadata/resolvers/resolve-url.ts +++ b/packages/next/src/lib/metadata/resolvers/resolve-url.ts @@ -73,8 +73,8 @@ function resolveUrl( } // Handle relative or absolute paths - const basePath = metadataBase.pathname || '' - const joinedPath = path.posix.join(basePath, url) + const pathname = metadataBase.pathname || '' + const joinedPath = path.posix.join(pathname, url) return new URL(joinedPath, metadataBase) } diff --git a/test/e2e/app-dir/app-basepath/app/manifest.ts b/test/e2e/app-dir/app-basepath/app/manifest.ts new file mode 100644 index 0000000000000..3f1c3a59914d3 --- /dev/null +++ b/test/e2e/app-dir/app-basepath/app/manifest.ts @@ -0,0 +1,7 @@ +import { MetadataRoute } from 'next' + +export default function manifest(): MetadataRoute.Manifest { + return { + name: 'NextJS Manifest', + } +} diff --git a/test/e2e/app-dir/app-basepath/app/another/opengraph-image.png b/test/e2e/app-dir/app-basepath/app/metadata/opengraph-image.png similarity index 100% rename from test/e2e/app-dir/app-basepath/app/another/opengraph-image.png rename to test/e2e/app-dir/app-basepath/app/metadata/opengraph-image.png diff --git a/test/e2e/app-dir/app-basepath/app/metadata/page.js b/test/e2e/app-dir/app-basepath/app/metadata/page.js new file mode 100644 index 0000000000000..9ac06150f5e11 --- /dev/null +++ b/test/e2e/app-dir/app-basepath/app/metadata/page.js @@ -0,0 +1,3 @@ +export default function Page() { + return
Page Metadata
+} diff --git a/test/e2e/app-dir/app-basepath/index.test.ts b/test/e2e/app-dir/app-basepath/index.test.ts index f7161723f8254..8e327b3133018 100644 --- a/test/e2e/app-dir/app-basepath/index.test.ts +++ b/test/e2e/app-dir/app-basepath/index.test.ts @@ -32,11 +32,16 @@ describe('app dir - basepath', () => { ).toBe(`Page 2`) }) - it('should prefix metadata og image with basePath', async () => { - const $ = await next.render$('/base/another') + it('should prefix segment metadata og image with basePath and pathname', async () => { + const $ = await next.render$('/base/metadata') const ogImageHref = $('meta[property="og:image"]').attr('content') + expect(ogImageHref).toContain('/base/metadata/opengraph-image.png') + }) - expect(ogImageHref).toContain('/base/another/opengraph-image.png') + it('should prefix manifest with basePath', async () => { + const $ = await next.render$('/base/metadata') + const manifestHref = $('link[rel="manifest"]').attr('href') + expect(manifestHref).toContain('/base/manifest.webmanifest') }) it('should prefix redirect() with basePath', async () => {