站長常遇到一個困惑:明明在 robots.txt 里 Disallow 了某個目錄,搜尋结果里却還能看到這些地址。反過来,有时候加了 noindex,頁面却迟迟不登出索引。這两個指令管的根本不是同一件事,混着用就容易出現上面两種情况。
两個指令解决的是不同問题
- Disallow:告诉蜘蛛“別来抓”。它控制的是抓取行為,属于 robots.txt 层面的约定。
- noindex:告诉蜘蛛“別把這一頁放進索引”。它控制的是收錄结果,但它寫在頁面上,蜘蛛必须先抓到頁面才能看到。
一句话记:Disallow 管“来不来”,noindex 管“留不留”。而 noindex 生效的前提,是蜘蛛能来。
為什么被 Disallow 的頁面還出現在结果里
常见原因有三類,可以先對号入座:
- URL 可以通過外鏈、sitemap、其他站点的引用被發現。即使蜘蛛没抓正文,也可能建立一個只有地址或标题的索引條目。
- 頁面在被屏蔽之前就已经被抓取並收錄了。抓取被挡住並不會自動刪除已有的索引记錄。
- 蜘蛛看到 Disallow 後選擇不抓取,自然也讀不到頁面里的 noindex,于是“屏蔽”和“登出索引”两件事都没完成。
想让頁面真正登出索引,顺序不能颠倒
- 先不要屏蔽抓取,确保蜘蛛能正常取到頁面内容。
- 在頁面上返回 noindex,用 meta 标簽或 HTTP 响應头都可以。
- 等索引里的條目消失,期間保持頁面可被抓取。
- 確認登出後,再考虑用 robots.txt 屏蔽,或者干脆让頁面下线。
如果頁面本身已经不需要存在,直接返回 410 或 404 通常更干净,不必绕這條鏈路。
几個容易踩的坑
- 屏蔽了 JS 或 CSS,而 noindex 是由脚本渲染出来的,蜘蛛看不到這個指令。
- 先 Disallow 再加 noindex,结果 noindex 永遠没有机會生效。
- 用 X-Robots-Tag 做控制,但只對部分 UA 返回,測試环境和线上表現不一致。
- robots.txt 里的路径是前缀匹配,寫 /private 會连带屏蔽 /private-page,需要寫得更精确。
- 屏蔽了带參數的 URL,又指望用 canonical 把權重收拢,可蜘蛛抓不到頁面,自然也讀不到 canonical。
怎么驗證是否真的生效
- 看索引狀態:用站点维度的查询或索引报告,注意区分“已被屏蔽抓取”和“已抓取但未编入索引”两種狀態,它們對應的問题完全不同。
- 看服務器日誌:如果目标目錄里再也看不到蜘蛛的訪問记錄,說明屏蔽起了作用;如果仍有訪問,多半是規則寫错了位置或语法有誤。
- 單頁排查:拿一個測試地址做對照,處理前後各记錄一次狀態,比只看總量更可靠。
和 sitemap、内鏈的配合
sitemap 里繼續列着已经 noindex 的 URL 是自相矛盾的,確認登出索引後就應该清理。同样,站内連結如果一直指向准备下线的地址,蜘蛛會反复發現它,登出的過程也會更慢。想让一個頁面安静地离開索引,除了指令本身,還要检查有没有別的地方在替它做宣传。
把“抓取”和“收錄”分開想,很多問题就清楚了:要留住抓取、拿掉收錄,用 noindex;要节省抓取、彻底不让来,用 robots.txt。两者顺序错了,指令就是在空轉。