- 在 Next.js 15/16 中配置 `htmlLimitedBots: /.*/` 可强制将 `<title>`、`<meta name="description">` 与 `<link rel="canonical">` 同步输出在 `<head>` 标签内。
- 严禁在页面顶层使用 `<Suspense fallback={<Spinner/>}>` 或客户端 `if (!mounted) return null`,否则爬虫首包抓取到的仅是空壳或 `<div hidden id="S:0">`。
- 坚持使用 Server Components 直接渲染 `<header>`、`<main>`、`<h1>`、`<article>` 与 `<footer>`,将客户端交互状态局部隔离在叶子组件中。
一、为什么使用了 Next.js App Router 依然会出现“爬虫抓不到正文”?
许多前端团队将站点从传统 SPA 迁移至 Next.js App Router 后,误以为只要用了框架就天然具备完美的 SSR SEO 能力。然而在实际通过模拟 Baiduspider 或 `curl` 检查首包 HTML 时,却震惊地发现:页面主体内容被包裹在 `<div hidden id="S:0">` 标签中,或者 `<head>` 内部根本没有 `<title>` 和 `<link rel="canonical">`(被推迟到了 `<body>` 底部的流式脚本块里)。
造成这一现象的根源在于 React Server Components 的流式悬停(Streaming Suspense)与异步元数据(Async Metadata)机制。当页面存在顶层 `loading.tsx`、包裹全页的 `<Suspense>` 边界,或者未命中框架内置的受限爬虫正则时,Next.js 会优先发送包含加载占位符的 HTML 外壳,随后通过内联 `<script>` 动态替换 DOM。对于不执行复杂流式 DOM 拼接的普通文本爬虫而言,带有 `hidden` 属性的节点或延迟注入的 `<head>` 标签极易导致标题识别失败与正文提取残缺。
二、核心配置:通过 htmlLimitedBots 强制同步输出 <head> 元数据
Next.js 内置了一份 `HTML_LIMITED_BOT_UA_RE` 正则名单,只有命中该名单的 User-Agent 才会触发阻塞式完整 `<head>` 输出;而许多国内搜索引擎的细分爬虫、自研 SEO 巡检工具或无特殊 UA 的 HTTP 客户端则会收到流式延迟的元数据。
为了确保任何搜索引擎爬虫、社交卡片抓取器与自动化 SEO 验证脚本在任何请求下都能在 `<head>` 中拿到完整的 `<title>`、`description`、`canonical` 与 OpenGraph 标签,我们必须在 `next.config.ts` 中显式声明 `htmlLimitedBots: /.*/`。
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
// 强制对所有爬虫与客户端在 <head> 内同步输出完整 Metadata,杜绝流式延迟到 <body>
htmlLimitedBots: /.*/,
images: {
unoptimized: true,
},
async redirects() {
return [
{
source: "/:path*",
has: [{ type: "host", value: "siseo.cn" }],
destination: "https://www.siseo.cn/:path*",
permanent: true,
},
];
},
};
export default nextConfig;本文常见问答(FAQ)
开启 htmlLimitedBots: /.*/ 会影响普通用户的首屏加载速度吗?
对于公开内容门户、技术博客与文档中心而言,`generateMetadata` 通常基于静态配置或高速缓存数据计算,耗时在数毫秒以内。开启同步 `<head>` 输出不仅不会造成肉眼可感知的延迟,反而消除了客户端动态修补 `<title>` 带来的闪烁,同时带来 100% 确定性的爬虫抓取保障。
如何在页面中使用 @heroui/react 组件同时保持优秀的 SSR 表现?
可以将页面的外层语义结构(header、main、article、section、h1~h3、p)保留在 Server Component 中,或将需要交互的 `@heroui/react` 组件(如 Card、Chip、Button、Accordion)封装在独立的客户端组件内并直接同步渲染其完整内容,不添加任何客户端挂载阻塞逻辑。
使用 SISEO 站点健康度引擎一键检测 SSR 首包可见性
模拟 Baiduspider 与 Bingbot 原始抓取视角,自动检测页面是否存在流式隐藏节点、缺失 H1 或客户端空壳渲染风险。