Nuxt 4 SEO 实战:Canonical、Sitemap 与结构化数据

从 SSR 元数据、规范链接、索引策略、robots.txt、sitemap.xml 到 BlogPosting JSON-LD,整理一套适合内容站的 Nuxt 4 SEO 落地方法。

Nuxt 4 SEO 实战:Canonical、Sitemap 与结构化数据

内容站的 SEO 不是在首页加一组 keywords 就结束了。搜索引擎需要知道页面主题、哪个 URL 是规范版本、哪些页面值得索引,以及站内有哪些可发现的内容。Nuxt 的 SSR 能让这些信息直接出现在首屏 HTML 中,但前提是页面元数据和 URL 规则设计完整。

一张 SEO 基础检查表

项目 作用 推荐做法
title 描述页面主题 每页唯一,核心词靠前
description 搜索结果摘要候选 说明页面价值,避免堆词
canonical 声明规范 URL 指向绝对 HTTPS 地址
robots 控制索引策略 低价值页 noindex,follow
sitemap 帮助发现 URL 只放公开、可索引页面
JSON-LD 描述内容实体 文章页使用 BlogPosting

页面级元数据

vue
<script setup lang="ts">
const config = useRuntimeConfig()
const route = useRoute()

const canonical = computed(() =>
  new URL(route.path, config.public.siteUrl).toString(),
)

useSeoMeta({
  title: 'Nuxt 4 SEO 实战',
  description: '一套可以真正落地的 Nuxt 4 内容站 SEO 方法。',
  ogTitle: 'Nuxt 4 SEO 实战',
  ogDescription: '从 canonical 到结构化数据。',
  ogType: 'article',
})

useHead({
  link: [{ rel: 'canonical', href: canonical }],
})
</script>

canonical 应使用绝对 URL。分页参数、跟踪参数和同一内容的多个入口,都要统一到明确的规范地址。例如第一页统一指向 /articles,而不是同时保留 /articles?page=1

哪些页面不应该索引

站内搜索结果、空标签页以及重复度较高的深层分页,通常没有必要争夺收录资源:

ts
const page = computed(() => Number(route.query.page || 1))
const shouldIndex = computed(() => page.value <= 1)

useSeoMeta({
  robots: computed(() =>
    shouldIndex.value ? 'index,follow' : 'noindex,follow',
  ),
})

noindex,follow 表示不收录当前页面,但仍允许搜索引擎沿页面链接发现文章。不要在 robots.txt 中屏蔽这些页面后又期待爬虫读取页面里的 noindex;两种策略要保持一致。

用服务端路由生成 robots.txt

ts
// server/routes/robots.txt.ts
export default defineEventHandler((event) => {
  const config = useRuntimeConfig(event)

  setHeader(event, 'content-type', 'text/plain; charset=utf-8')
  return [
    'User-agent: *',
    'Allow: /',
    'Disallow: /search',
    `Sitemap: ${config.public.siteUrl}/sitemap.xml`,
  ].join('\n')
})

管理后台、搜索参数页和内部接口不应进入 sitemap。公开文章、标签聚合页和重要固定页面才是重点。

Sitemap 的关键不是 XML,而是数据

生成 sitemap 时至少注意三点:

  1. 读取全部已发布文章,而不是只取接口第一页。
  2. URL 统一使用规范域名和 HTTPS。
  3. lastmod 使用真实发布时间或更新时间,不要每次请求都写当前时间。

文章很多时应分页读取后端接口,并设置合理缓存,避免爬虫每次访问 sitemap 都触发大量数据库查询。

为文章注入 BlogPosting JSON-LD

ts
const articleSchema = computed(() => ({
  '@context': 'https://schema.org',
  '@type': 'BlogPosting',
  headline: article.value.title,
  description: article.value.summary,
  datePublished: article.value.publishTime,
  mainEntityOfPage: canonical.value,
  image: article.value.coverUrl ? [article.value.coverUrl] : undefined,
  publisher: {
    '@type': 'Organization',
    name: '我的博客',
    logo: {
      '@type': 'ImageObject',
      url: `${config.public.siteUrl}/logo.png`,
    },
  },
}))

useHead({
  script: [{
    type: 'application/ld+json',
    innerHTML: () => JSON.stringify(articleSchema.value),
  }],
})

结构化数据必须与页面可见内容一致。它能帮助搜索引擎理解文章,但不保证一定展示富摘要。

面向百度的补充动作

  • 在百度搜索资源平台验证主站规范域名。
  • 提交 sitemap,并持续观察抓取异常。
  • 为新文章提供首页、标签页和相关文章入口。
  • 保持 URL 稳定;变更地址时使用 301 跳转。
  • 确保 SSR 源码里已经包含正文、title、description 与 canonical。
  • 不制造大量只有标题或重复摘要的薄内容页面。

小结

技术 SEO 的目标,是让搜索引擎用尽量低的成本发现并理解高质量内容。先统一域名和 URL,再补全 SSR 元数据、索引策略、站点地图与结构化数据,最后通过稳定更新和站内链接持续积累页面价值。

参考:Nuxt 4 SEO 与 Meta 官方文档