很多站長把 robots.txt 当成一個“別收錄”的開關,實际上它管的是更前面的一步:蜘蛛從哪些 URL 開始走、哪些路径不必走。規則寫得清楚,抓取路径會更集中;規則寫得含糊,蜘蛛可能把時間花在你並不關心的頁面上,或者反過来,把渲染頁面所需的资源也挡在门外。
蜘蛛讀 robots.txt 的顺序
多數搜尋引擎蜘蛛在抓取一個新站点、或長時間未訪問的站点时,會先請求 /robots.txt,然後才把 URL 放進抓取队列。這個文件本身通常不會被索引,但它决定了後續哪些 URL 能進入队列、哪些會被直接跳過。也就是说,它影响的是“抓不抓”,而不是“收不收”。被禁止抓取的 URL 依然可能因為外鏈、Sitemap 或其它入口被收錄,只是蜘蛛没去讀内容。需要控制收錄时,不要只依赖這一個文件。
規則之間怎么互相覆盖
按 UA 分组,最長匹配優先
同一份文件里可以有多個 User-agent 段落,蜘蛛只會讀取與自己匹配的那一段,以及通配的星号段。寫法越简單越稳妥,建议不要寫太多层特殊分组。当多條規則同时命中同一個路径时,一般以匹配字符最長的那條為准,而不是以出現顺序為准。所以“先寫 Disallow: /,再寫 Allow: /public/”這種寫法,通常能让 /public/ 下的頁面保持可抓取,前提是 Allow 的匹配長度确實更長。
User-agent: *
Disallow: /search
Disallow: /*?sort=
Allow: /search/help
這段規則的含义是:站内搜尋结果頁和带排序參數的 URL 不抓,但 /search/help 這類固定帮助頁保留。通配符 * 表示任意字符,$ 表示路径结尾,用好這两個符号能让規則更精确,也能避免誤伤带相同前缀的正常頁面。
別把渲染资源挡掉
把 /js/、/css/、/images/ 整個目錄禁止抓取是常见做法,但對依赖前端渲染的站点来说,蜘蛛拿不到样式和脚本,就可能看到空頁面或错乱的版面。如果這些目錄里没有需要隐藏的内容,保持可抓取通常比封掉更好。真正需要屏蔽的是重复的、無價值的、會消耗抓取量的路径。
哪些路径适合挡在门外
- 站内搜尋结果頁、按任意關鍵詞生成的聚合頁;
- 带排序、篩選、會话 ID 等參數的 URL 變体;
- 後台、測試目錄、临时上传目錄;
- 重复的打印頁、没有實质内容的空列表頁。
這些路径往往能通過内鏈或參數被不断生成,蜘蛛一旦跟進去,就會在同一個模板上来回打轉。把它們寫進 robots.txt,等于给抓取路径做了一次收敛。
Crawl-delay 與實际抓取压力
Crawl-delay 並不是所有蜘蛛都支持的指令,主流搜尋引擎大多根據自己的判断調整抓取速度,而不是嚴格按這個數值执行。想真正控制服務器压力,更直接的办法是让响應保持稳定、避免超时,在压力過大时返回 429 或 503,並保證恢复後能正常响應。把 Crawl-delay 寫成很小的值,通常不會带来更多抓取,反而可能被忽略。服務器稳定性對抓取路径的影响,往往比這一行參數更明顯。
把 Sitemap 寫在這里
在 robots.txt 中声明 Sitemap 地址,是让蜘蛛顺手發現站点地图的常见方式:
Sitemap: https://example.com/sitemap.xml
它只是多给一個入口,不能替代站点地图本身的可訪問性和内容质量。地图里的 URL 如果大量是重定向、404 或已被禁止抓取,蜘蛛跟過去也會很快放弃。
改完之後看什么
- 改動前先备份現有規則,避免誤寫 Disallow: / 造成整站不可抓取;
- 用搜尋引擎提供的 robots 測試工具检查規則是否命中预期路径;
- 观察服務器日誌里 robots.txt 的請求频率和抓取量的變化;
- 不要频繁来回修改,規則反复變動會让蜘蛛的抓取节奏變得不稳定。
robots.txt 不承诺收錄,也不负责排名,它更像一份寫给蜘蛛的路径說明。把它寫清楚,让该抓的路径畅通、该绕開的路径明确,剩下的交给内容质量和内鏈结构去完成。