User-Agent 分流与动态渲染算不算 cloaking?Google 官方边界说明
按 UA 给爬虫返回静态 HTML、给用户返回 SPA,到底是合规的动态渲染还是违规的 cloaking?以 Google 官方原文和一次真实站点实测给出判断标准。
一、官方定义
Google 把 dynamic rendering 定义为:服务器识别可能无法处理 JavaScript 的爬虫,向它们返回不依赖 JS 的 server-rendered 版本,普通用户仍看到客户端渲染版本。原文:
Dynamic rendering is a workaround and not a recommended solution, because it creates additional complexities and resource requirements.
并且官方在页面开头直接建议改用 server-side rendering、static rendering 或 hydration。
二、判定 cloaking 的分界线
同一份文档写得很清楚:
As long as your dynamic rendering produces similar content, Googlebot won't view dynamic rendering as cloaking. Using dynamic rendering to serve completely different content to users and crawlers can be considered cloaking.
而 spam policies 里 cloaking 的定义是:
presenting different content to users and search engines with the intent to manipulate search rankings and mislead users
其中一条典型示例就是「仅在 UA 为搜索引擎时插入文本或关键词」。所以分界线不是「有没有按 UA 分流」,而是两边内容是否实质相似 + 有没有操纵意图。
| 做法 | 判定 |
|---|---|
| 爬虫看纯文本版、用户在 SPA 里看同一份文档 | 相似内容,通常不算 cloaking |
| 爬虫看到额外堆砌的关键词、用户看不到 | 官方列举的 cloaking 示例 |
| 所有访问者一律 SSR 同一份 HTML | 最稳,无需举证 |
三、实测样本
对 kuku.baidu.com/landing/tscp_doc/{md5} 的实测结果:
- Googlebot / Baiduspider / bingbot → 200,8.4 KB 静态文章页;
- 普通 Chrome → 302 到 SPA 壳;
- 连「普通 Chrome UA + spider 字样」也命中静态页,说明是宽松的关键词正则,不是只针对某一家;
- Google 结果摘要逐字对应静态页正文第六节 → 没有另编关键词。
按上面的标准,这属于相似内容的动态渲染,不是 cloaking。
四、工程上真正要注意的坑
缓存串味
按 UA 分流却没在响应头声明 Vary: User-Agent,CDN 可能把爬虫版缓存后发给用户,或反过来。实测样本只返回了 Vary: Accept-Encoding。自己实现时务必补上。
内容漂移
今天两边一致,不代表半年后还一致。SPA 迭代时很容易出现「用户版改了、爬虫版没改」,这才是最容易踩线的地方。
结论
抄「静态化」,别抄「UA 分流」。 让所有人拿同一份 SSR HTML,抓取效率一样,合规风险归零,维护成本也更低。
常见问题
按 UA 分流一定违规吗
不一定。官方明确:只要给用户和爬虫产生的是相似内容,通常不算 cloaking。
为什么官方不推荐动态渲染
因为它增加复杂度和资源需求,官方推荐 SSR、静态渲染或 hydration。
最稳的做法是什么
所有访问者一律返回同一份 SSR HTML,完全绕开 UA 判定。
依据 Google Search Central《Understand dynamic rendering》与《Spam policies for Google web search》原文,以及本机 curl 实测响应。