站点运营

robots.txt 里的一行規則,可能挡住整站最该被發現的頁面

robots.txt 是站点對外發布的抓取規則,寫错一行就可能挡住整類頁面,也可能该挡的没挡住。本文梳理常见的規則誤伤、通配符與分组寫法問题,以及改完規則後如何確認生效,帮你在站点运营中少踩坑。

站点运营

robots.txt 里的一行規則,可能挡住整站最该被發現的頁面

robots.txt 是站点對外發布的抓取規則

robots.txt 放在站点根目錄下,是蜘蛛訪問任何頁面之前會先讀取的文件。它不控制收錄,只控制抓取:允许抓的頁面,蜘蛛才去看;不允许抓的頁面,蜘蛛连内容都拿不到。正因為它是入口處的總闸,一行寫错,影响面往往不是一两個 URL,而是一整類頁面。

很多站点出問题,並不是没寫 robots.txt,而是寫了之後没人再回头看。規則是几個月前临时加的,屏蔽是為了測試,後来上线、改版、迁移,這段規則還留在那里。

常见的几類規則誤伤

临时屏蔽忘了删

開發阶段為了防止測試环境被抓,常见做法是寫上一段 Disallow: /。上线时如果只改了域名,没删這一行,整站對外就是關閉狀態。蜘蛛来一次發現全站被拒,之後就會顯著降低訪問频率,恢复起来比屏蔽本身慢得多。

通配符和结尾符用错

robots.txt 的路径匹配是前缀匹配,不是精确匹配。寫 Disallow: /search 會连带挡住 /search-about、/searching 這類同前缀的地址。想只挡某一類,通常要配合 * 通配符和 $ 结尾符使用,比如 Disallow: /*?print= 或 Disallow: /tmp$。反過来,以為加了 $ 就能精确匹配,却把带參數的正常頁面也拦在外面,也是常见情况。

把静態资源目錄一起屏蔽

有的站点為了省抓取量,把 /assets/、/static/、/js/ 一並屏蔽。结果是頁面本身還能抓,但蜘蛛拿不到样式和脚本,無法還原頁面结构,判断内容质量时容易吃亏。CSS 和 JS 文件通常不占多少抓取预算,不建议一刀切。

分组規則互相冲突

一個 User-agent 分组内可以寫多條 Allow 和 Disallow。当同一條路径同时命中允许和禁止时,一般以匹配更長的那條為准,長度相同时 Allow 優先。如果分组寫得随性,比如先寫 Disallow: /article 又在下面寫 Allow: /article/new,實际结果會和新手预期不一致。把這些規則排好序、寫清注释,比事後排查省事得多。

把 Sitemap 声明寫错

Sitemap 通常寫在 robots.txt 末尾,需要完整的绝對地址。寫成相對路径、寫在被屏蔽的分组里、或者域名带上了測試參數,都可能導致蜘蛛讀不到。文件本身没問题,声明寫错等于没寫。

robots.txt 不等于“不能被收錄”

這是最容易誤解的一点。被 Disallow 的 URL 只是不會被抓取,它仍然可能因為外鏈、歷史记錄等原因出現在索引里。如果一條 URL 已经進了索引,想让它登出,正确顺序是先允许抓取、再在頁面上给出 noindex,等蜘蛛抓到並看到 noindex 之後才會移除。反過来,先屏蔽再指望它掉出索引,通常只會让蜘蛛永遠看不到 noindex,頁面就一直留在那里。

判断一條 URL 该用哪種方式處理:不想被訪問,用 robots.txt;不想被收錄,用 noindex;两者都用时,先確認頁面能被抓到。

改規則前後的自查清單

  • 文件是否返回 200,路径是站点根目錄下的 /robots.txt,而不是子目錄或带參數的地址。
  • 是否有遗留的 Disallow: /,逐個分组確認,而不是只看第一段。
  • 被屏蔽的目錄里,有没有正在對外提供内容的主栏目、图片库、接口返回頁。
  • 通配符和结尾符是否符合预期,前缀匹配有没有誤伤同前缀地址。
  • Sitemap 是否用绝對地址声明,且文件本身能正常打開。
  • 不同 UA 分组的規則是否互相矛盾,有没有寫重复的分组头。

改完之後怎么確認

改完不要直接等结果。可以先用搜尋引擎提供的 robots.txt 測試工具,把被屏蔽的關键 URL 逐條喂進去看判定结果;再去服務器日誌里核對,規則生效後,原本频繁出現的 403 或抓取請求應当明顯减少,而该抓的栏目頁訪問量應逐步回升。

還要留出生效時間。蜘蛛對 robots.txt 有缓存,規則改動不會立刻全網同步,尤其是原本抓取频率就比較低的站点。改完之後保持内容正常更新、内鏈结构稳定,让蜘蛛有理由再回来,比反复改規則更有效。