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 时至少注意三点:
- 读取全部已发布文章,而不是只取接口第一页。
- URL 统一使用规范域名和 HTTPS。
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 元数据、索引策略、站点地图与结构化数据,最后通过稳定更新和站内链接持续积累页面价值。