先给结论:不要直接比较两边的页面正文,而要比较同一路径在两种状态下返回的HTTP状态码和响应头。设备或登录状态差异通常不会改变robots.txt本身,而是让同一URL在服务端走了不同分支。你需要先固定一个可复现的对照条件,再判断这条路径是否真的被规则挡住,以及挡住的是抓取还是索引。
同一地址返回不同内容,可能发生在三个层次:robots.txt文件本身、目标URL的响应、以及页面渲染后的可见内容。设备或登录状态一般只影响后两层。把这三层分开记录,才能避免把“登录后能看到”误判为“规则已放行”。
/robots.txt,看两种状态下返回的文件内容是否一致。若一致,说明差异不在规则文件。Location、X-Robots-Tag、Vary等响应头。如果第一层就不同,说明问题在规则分发,而不是目标页面。此时应优先核对是否有CDN、反向代理或按UA分发的配置。若第一层一致而第二层不同,问题更可能在应用层的设备识别或会话判断。
建议为每个待处理路径建立一张对照记录,至少包含以下字段。这样做的目的是让“设备A能看、设备B不能看”变成可复查的证据,而不是凭印象判断。
Vary、Cache-Control、X-Robots-Tag。Disallow或Allow覆盖。一个假设例子:某旧活动页在未登录时返回302跳转到登录页,登录后返回200。若只看登录后的200,会误以为该页可被抓取;但未登录状态下的302才是抓取工具实际遇到的分支。此时应把未登录响应作为主要判断依据,而不是登录后的页面内容。
当旧内容、旧系统或旧合作关系需要退出时,常见做法是整站或整目录加Disallow。但抓取限制不等于可靠的索引移除。若页面已被索引,仅靠robots.txt规则通常不会让已有索引立即消失,因为规则阻止的是抓取,而不是索引状态本身。
更稳妥的顺序是:先判断该路径是否还有保留价值。若完全无价值,优先让页面返回410或301到新地址,再考虑是否需要在robots.txt中限制抓取。若仍有部分价值,例如旧文档中的某几个章节要保留,则应只对无价值子路径设置规则,而不是封锁整个目录。
实际动作:把待退出路径按“保留”“跳转”“彻底移除”三类分开,分别记录当前状态码和规则匹配情况。这个动作的结果会直接影响下一步:若某路径已返回410,就不需要再为它单独加Disallow;若某路径仍返回200且有流量,则应先处理页面本身,而不是先改规则。
改动robots.txt后,不要只用一种设备或一种登录状态验证。应在与改动前相同的条件下重复请求,比较状态码和响应头是否发生变化。若状态码未变,说明规则改动可能没有生效,或被缓存、代理、应用层逻辑覆盖。
需要分别核查不同搜索引擎的支持情况。不同抓取工具对Allow、通配符和结尾匹配的处理并不完全一致,不能假设一处生效即处处生效。站点地图也不保证收录,它只是发现路径的辅助手段,不能替代对单条路径的响应判断。
如果请求量或抓取量归零,也不能单独证明处理正确。缓存过期、抓取预算调整、页面本身返回错误,都可能造成类似现象。应结合状态码、响应头和规则匹配记录一起判断,而不是只看某一个统计数字。
面对同一地址因设备或登录状态返回不同内容,最终要回答的是:这条路径应保留、跳转还是移除。若未登录状态返回302且登录后返回200,优先检查302是否指向登录页;若是,则说明该路径对未登录抓取不可见,应按“需登录”处理,而不是按“已放行”处理。若两种状态都返回200但正文不同,则应检查Vary头是否正确声明,避免缓存把一种状态的内容错误地返回给另一种状态。
只有在明确路径已无保留价值、且页面本身已返回410或301之后,才考虑用robots.txt规则进一步限制抓取。这个顺序能避免把“抓取限制”误当成“索引移除”,也能让旧内容退出过程留下可复查的记录。