你的 GraphQL 网站,在百度眼里是“天书”吗?
你刚用 GraphQL 把项目跑起来了,接口清爽、前端灵活,连同事都夸你选得对。
结果一查百度收录——首页没动静,产品页搜不到,连自己发的博客都排在几十页外。不是没更新,不是没外链,就是“看不见”。这感觉,像在热闹街市上喊话,但没人听见。
GraphQL 对搜索引擎来说,到底意味着什么?
GraphQL 是客户端说了算:要什么字段、嵌套几层、过滤哪些数据,全由前端决定。
百度蜘蛛可不参与这场对话。它只做一件事:发一个 GET 请求,收回一份 HTML。
如果你的 GraphQL 接口只响应 POST 或带复杂 query 参数的 GET,或者返回的是空 JSON、报错信息、甚至 404,那蜘蛛拿到的就是一张白纸。
它不会猜你要展示什么,也不会帮你补全标题、描述或正文。
一个真实案例:我们帮一家本地生活类网站排查收录问题。他们所有详情页都靠前端调 GraphQL 渲染。在百度搜索资源平台里直接抓取页面,<h1> 是空的,<meta name="description"> 没有值,正文区域只有 <div id="app"></div>。百度根本不知道这是家修空调的,还是卖蛋糕的。
百度蜘蛛能直接执行 GraphQL 查询吗?
不能。
它不解析 query 字符串,不构造变量,不处理 __typename,也不关心你的 schema 是否用了 union 类型。
就算你把查询语句硬塞进 URL(比如 /graphql?query={product{id,title}}),百度也大概率把它当无效参数忽略,或者直接返回 405 错误。
它的强项是读 HTML:从 <title> 到 <article>,从 <h2> 到 <a href>,它靠这些结构理解页面在讲什么。
你让它去读 JSON,就像让快递员按数据库日志找门牌号——他连楼在哪都不知道。
用 GraphQL 的网站,SEO 最大的坑在哪里?
两个字:空壳。
一是初始 HTML 空,二是内部链接藏得太深。
React/Vue + GraphQL 的常见组合下,页面首屏 HTML 往往只剩一个空容器,比如 <div id="root"></div>。
百度蜘蛛看到这个,通常不会等 JS 执行完再抓——它直接记一笔:“内容为空”,然后走人。
更麻烦的是链接。很多 SPA 网站的导航、相关文章、分类入口,全是 JS 动态插入的 <a> 标签,或者干脆用 router.push() 跳转。
这些链接对百度来说等于不存在。它爬不到第二层,权重传不出去,整个网站就像一座没门的玻璃房。
具体场景:一家教育机构用 GraphQL 加载课程列表和详情。列表页源码里没有一个真实的 <a href="/course/xxx">,所有跳转都靠点击事件触发。百度连“Python 入门课”这个页面都没见过,更别说给它排名了。
如何让百度“理解”并喜欢你的 GraphQL 网站?
别让百度学 GraphQL。让它回到最熟悉的节奏:打开网页 → 看到完整 HTML → 知道这是什么内容 → 记住有哪些链接。
1. 用 SSR 或 SSG 把内容“焊死”在 HTML 里
Next.js、Nuxt.js、Remix 这些框架,天然支持在服务端跑 GraphQL 查询,生成带数据的 HTML 再吐给浏览器。百度来的时候,页面已经填满了标题、摘要、课程大纲、教师介绍……它一眼就懂。
2. 动态渲染,专供蜘蛛那一口
如果暂时没法改架构,可以加一层判断:识别百度蜘蛛的 User-Agent(如 Mozilla/5.0 (compatible; Baiduspider/2.0)),用 Puppeteer 或 Playwright 实时渲染出完整 HTML;其他人访问,照常走 SPA。成本不高,见效很快。
3. 至少把关键链接写进原始 HTML
哪怕主体内容必须 JS 渲染,主导航、面包屑、底部友情链接、文章页里的“上一篇/下一篇”,请老老实实写成 <a href="...">。别怕多几行代码——这是给百度留的爬行绳索。
今天就能执行的 GraphQL 网站 SEO 健康检查
现在就打开 百度搜索资源平台(你肯定已经绑过域名)。
点进左侧菜单的「URL 检查」→ 在输入框里粘贴一个你最在意的详情页地址(比如最新一篇技术文章、或者主推的一款服务页)。
点「抓取」,等几秒,切到「RAW HTML」标签页。
然后问自己三个问题:
<title>里写的真是这篇文章的标题吗?- 页面里有没有肉眼可见的正文段落(不是
<div class="loading">)? - 主导航栏、页脚、文章末尾的“相关推荐”,是不是真实的
<a href="https://yoursite.com/xxx">?
如果任意一条答不上来,说明百度还没真正“看见”你。
今天下班前,请打开你的 Next.js 项目或 Vite 配置文件,把 getServerSideProps 或 generateStaticParams 这一步加上——哪怕先试一个页面。 不用全量重构,先让百度吃上第一口热饭。