很多站点把 robots.txt 当成一個允许或禁止抓取的總開關,寫完就不再维護。實际執行中,它更像一份寫给蜘蛛的路线說明:哪些目錄可以走,哪些路径不必来,Sitemap 放在哪里。規則寫得不嚴谨时,出問题的往往不是全站被屏蔽這種顯眼故障,而是連結路径被截断、抓取预算消耗在無用地址上。
蜘蛛什么时候讀它,讀到的是哪一版
蜘蛛通常在抓取某個 URL 之前讀取该主机下的 /robots.txt,並且會缓存這份文件。缓存時間没有统一承诺,可能几小时,也可能更久。這意味着两件事:一是刚改完規則不要指望立刻生效;二是如果中途關閉了全站抓取,恢复时可能要等缓存過期。
另一個常被忽略的点是子域與协议。不同子域各自有獨立的 robots.txt,http 與 https 在多數實現里也被视為不同主机。站点迁移协议後,如果只在舊地址更新規則,新地址上可能仍是一份過期的文件。
Disallow 挡住的是抓取,不是收錄
被 Disallow 的 URL 並不會自動從索引中消失。如果其他頁面還在大量連結它,蜘蛛無法抓取内容来判断,只能依據外鏈锚文本等信息處理,结果可能是頁面仍在索引里,但摘要来自別處。想要真正让頁面登出,更稳妥的做法是先允许抓取、让頁面返回 404 或 410,或者用 noindex,確認狀態變化後再考虑屏蔽。
把 noindex 和 Disallow 同时用在一個 URL 上,是一個常见的互相抵消组合:規則挡住了抓取,蜘蛛也就讀不到 noindex。
通配符、结尾符與規則重叠
主流蜘蛛對 * 和 $ 的支持基本一致,但细节仍有差別。几條實用经驗:
- 用 $ 明确结尾,避免 /search 把 /search-help 一起挡住;
- 通配符不要连用太多层,規則越長越难维護,也越容易誤伤;
- 同一路径下,更具体的規則通常優先,但不要依赖直觉顺序,寫規則时就让每條互不重叠;
- 不要指望用 Disallow 挡參數頁,參數组合無穷,規則往往挡不全,反而留下半開的口子。
Sitemap 声明放在這里,不等于被讀取
在 robots.txt 里寫 Sitemap 地址是方便的做法,但它只是告诉對方文件的位置。文件本身能否被顺利抓取,取决于文件大小、层級數量、返回狀態碼以及是否被規則誤挡。如果 Sitemap 所在目錄被 Disallow,等于声明了一個不让進的入口。定期用抓取工具或服務器日誌確認 Sitemap 文件的訪問狀態,比只看 robots.txt 的内容更有意义。
内鏈被挡住,路径就断了
当關键栏目頁、分頁或标簽頁被規則挡住时,蜘蛛走到這里就停下,後面的連結也就無從發現。這類問题在日誌里表現為:入口頁有大量訪問,深层頁面几乎没有蜘蛛记錄,而你在頁面上明明做了内鏈。排查时可以先看被挡路径下面的 URL,是否還有別的方式能到達。Sitemap 可以作為补充,但内鏈才是日常抓取的主要路径。
用 robots 做节流,效果有限
Crawl-delay 只有部分蜘蛛支持,而且粒度很粗。真正影响抓取节奏的,更多是服務器响應時間、頁面返回狀態和内容更新频率。如果站点压力大,優先做的是缓存、压缩和稳定的响應,而不是在 robots.txt 里加一行延迟——規則不被遵守时,压力依舊存在。
一條可用的排查顺序
- 訪問 /robots.txt,確認返回 200,内容與预期一致;
- 检查各子域、http 與 https 是否都有對應規則;
- 拿具体 URL 對照規則,確認是否存在誤挡;
- 查看 Sitemap 文件本身能否被抓取,狀態碼是否正常;
- 结合服務器日誌,看蜘蛛在被挡路径下是否完全没有請求。
robots.txt 本身不复杂,复杂的是它與 Sitemap、内鏈、狀態碼之間的配合。把它当成一份需要定期复核的配置,而不是一次性寫死的開關,抓取路径會顺很多。