在收錄相關的操作里,robots.txt、noindex 和 canonical 是最常被混在一起用的三個手段。它們的共同点是看起来都能减少頁面被收錄,但實际作用的位置完全不同:一個在抓取层,一個在索引层,一個在归一化层。用错层級,最常见的後果不是頁面被屏蔽,而是指令根本没生效,或者頁面卡在一個尴尬的中間狀態。
先分清三道闸门各管哪一层
可以按抓取流程的先後顺序理解:
- robots.txt:作用在抓取层,决定蜘蛛能不能請求這個 URL。它是站点級的文件,按路径前缀匹配。
- noindex:作用在索引层,决定已经抓取到的内容要不要進索引。它寫在頁面里,属于頁面級指令。
- canonical:作用在归一化层,告诉搜尋引擎這几個 URL 里哪個是自己希望被采用的主版本。它是建议,不是强制。
顺序很重要:抓取在前,索引在後,归一化跟在两者之後。一個頁面如果抓不到,後面两层就没有机會被执行。
robots.txt 屏蔽的是抓取,不是收錄狀態
robots.txt 里寫 Disallow,蜘蛛就不會去請求對應路径。但這並不等于该頁面立刻從索引里消失。已经進入索引的 URL,可能還會以連結形式出現在结果中,只是缺少标题和摘要。想让它彻底登出,通常需要先放開抓取,让蜘蛛能讀到頁面上的 noindex,處理完成後再重新屏蔽。反過来,一邊 Disallow 一邊在頁面上寫 noindex,等于让 noindex 永遠讀不到,頁面會長期停在已收錄但内容不可见的狀態。
判断顺序很简單:只要 robots.txt 不允许抓取,頁面上任何關于索引的指令都等于没寫。
noindex 生效的前提是頁面能被抓取
noindex 是一個頁面級指令,可以放在 meta robots 里,也可以通過 HTTP 响應头 X-Robots-Tag 下發。它需要蜘蛛真正拿到這個頁面才能讀到。所以常见失效场景有两個:
- 頁面被 robots.txt 屏蔽,指令讀不到。
- 頁面返回 404、5xx 或者经過重定向,响應头里的 X-Robots-Tag 不一定能传递到最终 URL。
另外,noindex 與 canonical 同时出現在一個頁面上时,如果 canonical 指向了別的 URL,而那個目标 URL 本身是可索引的,處理结果會變得难以预测。比較稳妥的做法是:確認要移出索引的頁面,就让它自己 noindex,不要同时再指一個可索引的 canonical 出去。
canonical 解决的是多個 URL 選哪個,不是删掉哪個
canonical 常被当成合並重复内容的工具,但它做的是版本選擇。它不會让被指向的 URL 從抓取范围里消失,也不保證一定被采纳。搜尋引擎會综合内鏈、sitemap、歷史收錄情况做判断。如果站点里同时存在參數版本、排序版本、打印版本,先用 canonical 做归一化是合理的;但如果希望某個頁面根本不進入索引,canonical 不是合适的工具,應该用 noindex。
還有一点容易忽略:canonical 指向的頁面本身如果被 noindex 或 robots 屏蔽,整條信号鏈就断了,被指向的 URL 不會因此获得收錄。
實际操作的组合顺序
把三道闸门按流程排一下,處理起来會清晰很多:
- 先確認這個 URL 希望處于什么狀態:可抓可索引、可抓不索引,還是既不抓也不索引。
- 只想移出索引:保持 robots.txt 允许抓取,在頁面或响應头加 noindex,等索引狀態更新後再考虑是否屏蔽抓取。
- 只想节省抓取配額、不涉及移出索引:用 robots.txt 屏蔽,並接受它可能仍以 URL 形式存在。
- 多個 URL 指向同一内容:用 canonical 選主版本,同时把其他版本從内鏈和 sitemap 中收敛。
- 改完指令後,回到抓取日誌和索引狀態里核對,而不是只看配置文件有没有寫對。
這三種手段经常被並列寫進同一份收錄優化清單,但它們的生效條件和观察口径都不一样。寫之前先問一句:我卡住的是抓取、索引,還是版本選擇?答案不同,该動的開關也不同。