先確認現象:被收錄的到底是什么
發現索引里出現陌生 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 清單和對應的處理動作,下次再遇到類似情况可以直接對照,不必從零排查。