先确认现象:被收录的到底是什么
发现索引里出现陌生 URL,先别急着批量删。用 站内查询、抓取日志、服务器文件列表三处交叉比对,把多出来的 URL 大致分成三类:
- 服务器上真实存在、能正常打开的页面,常见于上传目录、缓存目录、临时文件被写入内容;
- 服务器上并不存在,但访问返回 200 的页面,多半是伪静态规则或程序把不存在的路径兜底成了正常页面;
- 正常页面本身被注入了外链或隐藏内容,页面还在,只是内容被改。
这三类处理方式不一样。第一类要删文件并封住目录执行权限,第二类要先改回正确的状态码,第三类要清理模板和数据库里的注入内容。如果混在一起统一删 URL,往往会漏掉真正的入口,过一阵又长出来。
第一步:切断发现路径,先止住增量
在清理完成之前,最要紧的是让爬虫别再发现新页面。
- 对确定是垃圾页面的目录,先用 robots.txt 的 Disallow 挡住抓取,这属于临时止血,不是移除手段;
- 检查 Sitemap 是否被自动生成了这些 URL,如果有,先修正生成逻辑,或临时替换成干净版本;
- 检查内链:注入内容通常会互相链接,形成一小片“站中站”。找到这片区域的入口页,比逐个删页面更有效。
robots.txt 只能阻止新的抓取,已经进入索引的 URL 不会因为屏蔽而自动消失,这两件事需要分开处理。
第二步:让这些 URL 返回正确的状态码
删掉文件、清理模板之后,确认访问返回的是 404 还是 410。
- 确定不会再有的页面,410 语义更明确,但 404 同样有效,不必为了选哪个反复纠结;
- 最忌讳的是页面不存在却返回 200,或者统一 301 跳到首页。前者会让垃圾页长期留在索引里,后者容易被当作无效跳转处理,问题并没有解决;
- 如果站点改过伪静态规则或做了兜底路由,一定单独验证一次随机不存在的 URL 返回什么状态码。
第三步:处理已经被收录的部分
索引里的旧 URL 消失需要时间,具体多久没有固定答案,取决于重新抓取与重新评估的节奏。
- 确认页面已返回 404 或 410,并且站内不再有链接指向它;
- 可以用站点管理后台的移除工具提交,作为临时手段,通常只在一定期限内有效;
- 如果页面必须保留但内容不想要,用 noindex 而不是删 URL,避免影响其他正常路径;
- 观察抓取日志里这些 URL 的访问频次是否下降,作为清理是否生效的参考。
第四步:查清注入入口,否则会复发
- CMS、插件、上传组件是否存在已知漏洞;
- 上传目录是否允许执行脚本;
- 模板文件、内容数据表、被写入的静态文件,是否有改动时间高度集中的痕迹;
- 站点是否存在批量生成的动态路由,比如任意参数都能返回 200 内容。
只删页面、不补入口,通常一两周内会再次出现同类 URL。
几个不建议做的操作
- 全站 robots.txt 屏蔽:正常页面也会停止被抓取,恢复后需要重新积累;
- 全站 noindex:同样会波及正常页面,回滚后重新进入索引也需要时间;
- 把所有多出来的 URL 统一 301 到首页:容易被视为无效跳转,垃圾页本身并没有被解决;
- 为了“清干净”把疑似目录整个删掉:先按目录分类,再决定删哪些。
清理后的监控
收尾阶段做三件事就够了:定期用站内查询抽查看垃圾 URL 是否减少,对比 Sitemap 与服务器真实页面列表,观察抓取日志中陌生目录是否还有新增。清理过程中保留一份 URL 清单和对应的处理动作,下次再遇到类似情况可以直接对照,不必从零排查。