Skip to content

Commit 9483a37

Browse files
authored
fix metadata basePath for manifest (#76681)
### What Static metadata manifest file should be prefixed with `basePath` when it's specified, as all the requests are sent to the routes under `/<basePath>/*`, it should also show the correct url in the html Fixes #56687 Closes NEXT-2707
1 parent bbce270 commit 9483a37

File tree

7 files changed

+32
-8
lines changed

7 files changed

+32
-8
lines changed

crates/next-core/src/app_page_loader_tree.rs

+9-2
Original file line numberDiff line numberDiff line change
@@ -133,11 +133,18 @@ impl AppPageLoaderTreeBuilder {
133133
return Ok(());
134134
};
135135

136-
let manifest_route = &format!("/{}", get_metadata_route_name(manifest).await?);
136+
let metadata_manifest_route = get_metadata_route_name(manifest).await?;
137+
// prefix with base_path if it exists
138+
let manifest_route = if let Some(base_path) = &self.base_path {
139+
format!("{}/{}", base_path, metadata_manifest_route)
140+
} else {
141+
metadata_manifest_route.to_string()
142+
};
143+
137144
writeln!(
138145
self.loader_tree_code,
139146
" manifest: {},",
140-
StringifyJs(manifest_route)
147+
StringifyJs(&manifest_route)
141148
)?;
142149

143150
Ok(())

packages/next/src/build/webpack/loaders/metadata/discover.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,9 @@ export async function createStaticMetadataFromRoute(
8686
const extension = staticManifestExtension.includes(ext.slice(1))
8787
? ext.slice(1)
8888
: 'webmanifest'
89-
staticImagesMetadata.manifest = JSON.stringify(`/${name}.${extension}`)
89+
staticImagesMetadata.manifest = JSON.stringify(
90+
`${basePath}/${name}.${extension}`
91+
)
9092
}
9193
return
9294
}

packages/next/src/lib/metadata/resolvers/resolve-url.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ function resolveUrl(
7373
}
7474

7575
// Handle relative or absolute paths
76-
const basePath = metadataBase.pathname || ''
77-
const joinedPath = path.posix.join(basePath, url)
76+
const pathname = metadataBase.pathname || ''
77+
const joinedPath = path.posix.join(pathname, url)
7878

7979
return new URL(joinedPath, metadataBase)
8080
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { MetadataRoute } from 'next'
2+
3+
export default function manifest(): MetadataRoute.Manifest {
4+
return {
5+
name: 'NextJS Manifest',
6+
}
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export default function Page() {
2+
return <div id="page-metadata">Page Metadata</div>
3+
}

test/e2e/app-dir/app-basepath/index.test.ts

+8-3
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,16 @@ describe('app dir - basepath', () => {
3232
).toBe(`Page 2`)
3333
})
3434

35-
it('should prefix metadata og image with basePath', async () => {
36-
const $ = await next.render$('/base/another')
35+
it('should prefix segment metadata og image with basePath and pathname', async () => {
36+
const $ = await next.render$('/base/metadata')
3737
const ogImageHref = $('meta[property="og:image"]').attr('content')
38+
expect(ogImageHref).toContain('/base/metadata/opengraph-image.png')
39+
})
3840

39-
expect(ogImageHref).toContain('/base/another/opengraph-image.png')
41+
it('should prefix manifest with basePath', async () => {
42+
const $ = await next.render$('/base/metadata')
43+
const manifestHref = $('link[rel="manifest"]').attr('href')
44+
expect(manifestHref).toContain('/base/manifest.webmanifest')
4045
})
4146

4247
it('should prefix redirect() with basePath', async () => {

0 commit comments

Comments
 (0)