Next.js Open Graph 图片无法正常显示

大多数 Next.js 预览问题都源于 Metadata API:缺少 metadataBase、openGraph 对象覆盖了父级配置,或者是图片文件大小超限。

最后更新

快速修复


  1. 在根布局(root layout)中设置 metadataBase,以便将相对图片路径转换为绝对 URL。

  2. 在任何需要覆盖它的页面中重复完整的 openGraph 对象。

  3. 将 opengraph-image 大小保持在 8 MB 以下,twitter-image 保持在 5 MB 以下。

  4. 使用meta 标签检查工具检查已部署的 URL,而不是 localhost。


为什么 Next.js 预览缺失或显示错误

  • 未配置 metadataBase 的相对图片路径。在基于 URL 的元数据字段中使用相对 URL 但未配置 metadataBase 会导致构建错误,而且社交平台也无法抓取相对路径。

  • 页面覆盖了 openGraph 并丢失了图片。布局(layout)和页面(page)中的元数据是浅合并的,因此页面的 openGraph 对象会替换掉布局的整个 openGraph,包括其中的图片。

  • 图片文件过大。opengraph-image 必须小于 8 MB,twitter-image 必须小于 5 MB,否则构建会失败。

  • 你在 localhost 或受保护的预览部署环境中进行了测试。外部平台是从它们自己的服务器抓取数据的,无法访问此类环境。

  • 平台缓存了之前的部署版本。修复后请刷新缓存。

如何修复

  1. 在 app/layout.tsx 中,设置 metadataBase: new URL('https://your-domain.com')。

  2. 当页面设置 openGraph 时,重新包含 images,或者从 generateMetadata 中展开父级图片。

  3. 或者在路由段中添加一个 opengraph-image.png 文件。Next.js 会自动为你添加 og:image 及其类型、宽度和高度。

  4. 对于动态生成的图片,使用来自 next/og 的 ImageResponse,并设置 size = { width: 1200, height: 630 }。

  5. 部署后,使用元标签检查工具检查公开的 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:alt

  • twitter: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。超出大小的文件会导致构建失败。

检查您的页面,然后刷新预览

将您的网址粘贴到免费检查器中,查看各个应用程序读取的具体标签。标签确认无误后,使用刷新工具清除旧的预览。