Next.js Open Graph 图片无法正常显示
大多数 Next.js 预览问题都源于 Metadata API:缺少 metadataBase、openGraph 对象覆盖了父级配置,或者是图片文件大小超限。
最后更新
快速修复
在根布局(root layout)中设置 metadataBase,以便将相对图片路径转换为绝对 URL。
在任何需要覆盖它的页面中重复完整的 openGraph 对象。
将 opengraph-image 大小保持在 8 MB 以下,twitter-image 保持在 5 MB 以下。
使用meta 标签检查工具检查已部署的 URL,而不是 localhost。
为什么 Next.js 预览缺失或显示错误
未配置
metadataBase的相对图片路径。在基于 URL 的元数据字段中使用相对 URL 但未配置 metadataBase 会导致构建错误,而且社交平台也无法抓取相对路径。页面覆盖了
openGraph并丢失了图片。布局(layout)和页面(page)中的元数据是浅合并的,因此页面的 openGraph 对象会替换掉布局的整个 openGraph,包括其中的图片。图片文件过大。
opengraph-image必须小于 8 MB,twitter-image必须小于 5 MB,否则构建会失败。你在 localhost 或受保护的预览部署环境中进行了测试。外部平台是从它们自己的服务器抓取数据的,无法访问此类环境。
平台缓存了之前的部署版本。修复后请刷新缓存。
如何修复
在
app/layout.tsx中,设置metadataBase: new URL('https://your-domain.com')。当页面设置
openGraph时,重新包含images,或者从generateMetadata中展开父级图片。或者在路由段中添加一个
opengraph-image.png文件。Next.js 会自动为你添加 og:image 及其类型、宽度和高度。对于动态生成的图片,使用来自
next/og的ImageResponse,并设置size = { width: 1200, height: 630 }。部署后,使用元标签检查工具检查公开的 URL。
Next.js 应该输出的标签
og:title、og:description、og:url带有
og:image:width、og:image:height和og:image:type的og:image来自
opengraph-image.alt.txt的og:image:alttwitter:card和twitter:image(绝对 URL)
你可以使用元标签生成器手动编写这些标签,并与构建输出进行比对。
图片尺寸规则
opengraph-image:.jpg、.jpeg、.png 或 .gif,最大 8 MB
twitter-image:相同格式,最大 5 MB
1200 x 630 像素是 Next.js 在其示例中使用的尺寸
流式元数据与爬虫
较新版本的 Next.js 可以将来自 generateMetadata 的元数据以流式传输方式输出到 body 中。对于解析 HTML 能力有限的爬虫(如 facebookexternalhit),Next.js 仍会阻止流式渲染,并将标签放入 head 中。它是通过 user agent 来检测这些爬虫的。你可以在 next.config 中使用 htmlLimitedBots 来覆盖该列表。
如何强制刷新缓存
Next.js 无法清除其他平台的缓存。部署后,需要在各平台上刷新:LinkedIn 使用 Post Inspector,Facebook 使用 Sharing Debugger,X、Slack 和 Discord 则可以通过添加新的查询字符串来刷新。刷新工具集合了所有这些平台。
参考来源
常见问题
为什么我的 Next.js og:image 是相对 URL?
未设置 metadataBase。请在根布局中进行设置,以便 Next.js 将相对路径转换为绝对 URL。
为什么我的页面会丢失布局中的 og:image?
Next.js 会对元数据进行浅合并。如果页面定义了 openGraph,它将直接替换布局中的 openGraph 对象,因此需要在页面中重新添加图片。
Next.js 中 opengraph-image 的文件大小限制是多少?
opengraph-image 限制为 8 MB,twitter-image 限制为 5 MB。超出大小的文件会导致构建失败。
相关指南
X (Twitter) 卡片未显示或未更新
X 会优先根据 twitter: 标签生成卡片预览,如果不存在则会回退使用 og: 标签。现在已经不再提供可以刷新缓存的验证工具了,因此解决方法就是配置正确的标签,并使用一个全新的 URL。
Framer 社交分享预览未更新
Framer 支持设置全站社交分享预览图、单页自定义覆盖以及 CMS 项目专属图片。如果新图片已经发布但仍显示旧图,通常是平台缓存导致的。
Webflow Open Graph 图片无法正常显示
Webflow 的 Open Graph 是按页面分别设置的,无法进行全局设置。CMS 模版页面需要一个图片字段,并且该集合中的所有图片必须保持相同的尺寸。