先直接回答:把同一个URL分别取“禁用脚本的原始响应”和“执行脚本后的渲染结果”,逐项比对标题、正文、链接和状态码,找出差异属于哪一类,再决定是修复服务端输出还是调整渲染方式。这一步之所以关键,是因为搜索引擎看到的往往是其中一种版本,而两种版本不一致时,收录判断会变得不可预测。下面以一个旧页面为例,把差异定位到可执行的动作。
选一个具体URL,而不是整站。优先选旧内容、旧系统或即将退出的合作页面,因为这类页面最容易出现静态与渲染不一致。准备两份快照:一份是禁用脚本后拿到的原始HTML,另一份是脚本执行完成后的DOM。两份都用同一时间、同一网络环境抓取,避免把缓存和地域差异误当成渲染差异。
动作上,先记录原始响应里的<title>、<meta name="description">、首个<h1>、正文段落数量和主要内链。再在渲染结果里记录同样几项。结果如何影响下一步:如果这些项目在两边完全一致,问题不在渲染差异,应转向抓取与索引层面;如果只有部分一致,差异就集中在那几项上,后续排查范围立刻缩小。
第一类是内容缺失:原始响应里没有正文,渲染后才出现。这通常说明内容依赖脚本注入。第二类是内容冲突:两边都有正文,但标题或关键段落不同,常见于旧模板残留与前端框架各写了一份。第三类是链接与状态差异:原始响应里链接指向旧地址,渲染后指向新地址,或状态码在两种情况下不同。
区分原因的证据要具体。假设一个旧产品页,禁用脚本时返回200,正文为空,只有一个“加载中”占位;渲染后正文完整,但标题仍是旧的。此时可以推断:服务端没有输出正文,而标题由服务端模板控制,前端没有覆盖它。这个推断需要验证,不能只凭一次抓取下结论。验证方式是再取一次渲染结果,确认标题是否稳定不变;如果稳定,说明冲突来自模板而非随机脚本。
不要同时改多处。先只改一个变量:让服务端在原始响应里输出与渲染结果一致的标题和首段正文。改完后重新取两份快照,比较差异是否消失。结果如何影响下一步:如果差异消失,说明问题在服务端输出缺失,应继续检查其他旧页面是否有同样模式;如果差异仍在,说明还有脚本覆盖或缓存层介入,需要继续排查渲染链路。
这里要说明一个适用条件:这个方法假设你能控制服务端输出。如果页面完全由第三方系统生成,无法改服务端,就只能评估渲染方案是否被目标搜索引擎支持。不同搜索引擎对脚本执行的支持情况不同,必须分别核查,不能用一个引擎的结果推断另一个。
旧页面往往同时存在“还有价值的部分”和“该退出的部分”。定位差异后,按价值决定保留还是移除。保留的部分应确保在原始响应里可见,而不是只存在于渲染结果中。要退出的部分,比如旧合作方注入的脚本或旧统计代码,应确认移除后不会让正文消失。
需要提醒的是,用robots.txt限制抓取不等于可靠的索引移除,它只阻止抓取,不保证已收录页面被移除。站点地图也不保证收录,它只是提供发现线索。因此对旧页面的处理,不能只靠这两项,要结合响应差异一起判断。
一个假设例子:某旧活动页在原始响应里有完整正文,但渲染后正文被旧合作脚本替换成推广模块。定位差异后发现,价值在于原正文,冲突来自脚本。动作是移除该脚本并保留正文,再验证原始响应与渲染结果是否一致。如果一致,页面可以继续保留;如果不一致,再决定是否重定向或下线。这个判断依据是差异归属,而不是抓取量或请求量的变化,因为那些数字归零可能有多种解释。
把每个URL的原始响应与渲染结果差异、采取的改动、复查结果记在同一处。复查时只看三件事:标题是否一致、正文是否在原始响应中可见、主要链接是否指向同一目标。三项都一致,才说明差异已处理。任何一项仍不一致,就回到对应类别继续定位。这样做的目的是让下一次遇到同类旧页面时,能直接复用判断路径,而不是重新猜原因。