先给结论:不要试图把两种状态“合并成一个页面”再判断收录,而应选定一个基准状态作为收录对象,把其他状态当作差异证据来对照。基准状态通常选“未登录 + 移动端 UA”或“未登录 + 桌面端 UA”中与你目标受众一致的那一个。然后分别抓取两种状态的响应体,比较标题、正文主体、链接和状态码,而不是比较渲染后的视觉截图。
同一 URL 在登录前后返回不同内容,常见于会员中心、地区切换、AB 实验或按 UA 分流。此时有两种看似都合理的做法:
选择条件很直接:如果核心内容在未登录时已经完整可读,选 A;如果核心内容必须登录才出现,应先考虑是否把可公开部分独立成一个无需登录的地址,而不是强行让登录态被收录。动作上,先用 curl 带不同 UA 抓同一地址,看响应体差异有多大——这一步的结果决定你后面是“修差异”还是“拆地址”。
浏览器会带上你的登录 Cookie、缓存和本地存储,肉眼看到的差异无法区分是服务端分流还是前端渲染。建议用命令行固定变量对照:
a.html。b.html。c.html。<title>、<h1>、主要段落文本、rel=canonical 和状态码。如果 a 与 b 的正文主体一致、只有导航或推荐位不同,属于可接受的设备适配,基准状态选哪个都行。如果 a 与 b 的正文主体不同,说明服务端按 UA 分流了内容,此时必须明确哪个版本才是你要被收录的版本,并让另一个版本通过 canonical 或跳转指向它。canonical 是提示而非强制指令,所以更稳的做法是让非基准状态直接 301 到基准地址。
第一类是登录态差异。你带 Cookie 抓到的内容,蜘蛛大概率抓不到,因此不能拿 c.html 去推断收录结果。第二类是缓存差异,CDN 或页面缓存可能让同一请求在不同时间返回不同版本,需要多抓几次确认是否稳定。第三类是前端渲染差异,响应体里没有正文、但浏览器里能看到,说明内容由 JS 注入,此时对照的应是渲染后的 DOM,而不是原始 HTML。
这里要说明一个边界:robots.txt 的抓取限制不等于可靠的索引移除。如果你为了阻止登录态被收录而屏蔽某路径,已收录的 URL 仍可能留在索引里,需要额外的移除手段,且不保证立即生效。同理,站点地图不保证收录,把基准地址放进 sitemap 只是帮助发现,不解决内容分流本身的问题。
假设你有一个商品详情地址,未登录时显示价格和简介,登录后额外显示库存和会员价。抓取对照发现:未登录与登录状态的标题、简介完全一致,差异只在价格区块。这是可接受的,基准状态选未登录,不必改结构。
再假设抓取发现未登录时正文只有一句“请登录查看”,登录后才有完整介绍。此时做法 B 不成立,因为蜘蛛拿不到登录态。可执行动作是把完整介绍放到一个无需登录的独立地址,原地址保留登录入口并指向新地址。做完这一步后,下一步是重新抓取新地址确认未登录即可读到完整正文,再决定是否提交该新地址——提交只是告知,收录与否仍取决于内容质量和抓取预算。
差异会随版本发布再次出现,所以对照不应只做一次。把上面三条抓取命令写成脚本,每次改动前后各跑一次,输出标题和正文摘要的差异。当差异从“导航不同”变成“正文不同”时,就触发一次基准状态复核。这样你判断的始终是“哪个状态代表这个地址”,而不是“为什么百度不收录”,后者往往把设备分流问题误当成收录问题。若涉及 HTTPS,需注意HTTPS 不保证安全无漏洞或排名,它只是传输层条件,与本次内容分流对照无关。
最后提醒:不同搜索引擎对登录态、UA 分流和 canonical 的支持情况须分别核查,百度的处理方式不能直接套用到其他引擎。把基准状态、对照命令和触发条件写进你的发布检查单,才能让同一地址的多状态问题在下一次改动时被稳定识别。