做站点运营的人常常把 robots.txt、noindex 和 canonical 当成同一類東西:都是“我不想让這個頁面被收錄”的工具。但三者在收錄鏈路里作用的位置完全不同,用错位置不但達不到目的,還可能让本该收錄的頁面消失,或者让不想出現的頁面繼續留在索引里。
先记住一條鏈路:發現、抓取、索引
一個 URL 要出現在搜尋结果里,大致要经過:蜘蛛發現這個地址、發起抓取拿到内容、判断内容是否值得進索引。三個指令分別卡在這條鏈路的不同环节上,混着用就容易互相打架。
robots.txt:管的是能不能抓
robots.txt 是抓取层面的约定,放在站点根目錄,告诉蜘蛛哪些路径不用来抓。它獨立于頁面内容存在,所以蜘蛛在抓取之前就能讀到。
這里有個经常被忽略的後果:被 robots.txt 挡住的 URL,並不會自動從索引里消失。如果這個地址通過外鏈、sitemap 或別的方式被蜘蛛知道,它可能仍然出現在索引中,只是没有摘要,结果頁上顯示的是一行光秃秃的連結。想彻底移除,必须让蜘蛛抓一次頁面、讀到 noindex 才行,而 robots.txt 恰好阻止了這次抓取。
robots.txt 适合用来节省抓取、挡住無意义的路径,不适合当作刪除收錄的手段。
noindex:管的是能不能進索引
noindex 寫在頁面层面,形式可以是 meta robots 标簽,也可以是响應头里的 X-Robots-Tag。對 PDF、图片這類非 HTML 文件,只能用後者。
它的生效前提是蜘蛛能抓到這一頁。所以当 robots.txt 和 noindex 同时指向同一個 URL 时,两者會互相抵消:抓不到,就讀不到 noindex,索引里的舊记錄也就一直留着。
還有两個细节值得注意:
- noindex 要放在能被解析的位置,靠脚本後期插入、或者只寫在 iframe 里的,可能来不及被看到。
- 從索引里去掉之後重新放開收錄,需要重新被抓取,节奏取决于站点整体情况,不會立刻回来。
canonical:管的是多個地址留哪一個
同一個内容常常有多個入口:带參數的、大小寫不同的、列表頁翻出来的。canonical 用来告诉搜尋引擎,這些地址里哪個是主版本。
它和上面两個指令最大的区別是:canonical 是提示,不是命令。搜尋引擎會结合内鏈、sitemap、外鏈指向和内容相似度,最终自己决定保留哪一條。你标了 A,它也可能留 B。
几種做法基本等于白标:
- canonical 指向一個已经被 noindex 的頁面,两個信号互相矛盾。
- 每頁都指向自己,但頁面之間内容高度重复,等于没提供任何信息。
- canonical 指向另一個域名,跨站归並通常不會被采纳。
- canonical 指向 404,或者中間隔着好几跳重定向的地址。
三個指令怎么配合
按目的来選,而不是按习惯来選:
- 頁面有價值,只是想換一個主地址:用 canonical 把重复版本指向主版本,不要用 noindex。
- 頁面完全不需要出現在搜尋里:用 noindex,同时確認它没有被 robots.txt 挡住。
- 這段路径只會消耗抓取、内容也没收錄價值:可以考虑 robots.txt,但要接受它可能仍以無摘要形式留在索引里。
- 已经收錄、現在想删掉:先撤掉抓取限制,让頁面能被抓到並讀到 noindex,等索引更新;紧急情况再用移除工具做临时處理。
一個简單的自查顺序
遇到某個頁面“该收没收”或者“不该收却收了”,可以按下面的顺序看一遍:
- 先看 robots.txt 有没有挡住這個路径;
- 再看源碼和响應头里有没有 noindex;
- 然後看 canonical 是否指向自己,指向的地址能不能正常訪問;
- 最後確認這個 URL 有没有内鏈或 sitemap 入口,蜘蛛有没有理由發現它。
這四步走完,大部分“指令互相打架”的問题都能定位到。真正的难点往往不在标簽本身,而在于站点里没人说得清這些标簽是谁、為了什么给谁加上的。把每條規則的来源记下来,比事後一個個頁面反查要省力得多。