robots.txt 是站点與搜尋蜘蛛之間最基础的一份约定文件,但它同时也是最容易“一改就出错”的文件之一。很多站点寫規則时只考虑“我要挡住哪些目錄”,却忽略了通配符和前缀匹配的實际行為,结果本该被抓取的栏目入口被顺带挡掉,蜘蛛连頁面都進不来,自然也就谈不上後續的 URL 發現。
前缀匹配不等于精确匹配
robots.txt 的 Disallow 按前缀匹配。寫 Disallow: /search 时,被挡住的不僅是 /search,還包括 /search-guide、/searching、/search-result 這類同前缀路径。如果站点里恰好有 /search-help 這样的内容頁,它就會在没有任何提示的情况下從抓取入口中消失。
需要限定某個目錄时,應把路径寫完整,例如 /search/,並在必要时用 $ 结尾符鎖定,避免規則向無關路径扩散。
通配符常见的几類誤伤
- 结尾缺 $:Disallow: /*.pdf 會顺带匹配到 /doc/report.pdf.html 這類路径,作用范围超出预期。
- 斜杠開头的通配:Disallow: /*? 會挡住所有带參數的地址,包括分頁、列表篩選這些本可作為正常入口的 URL。
- 夹在路径中的通配:Disallow: /*/print 看似只挡打印頁,實际會命中任意层級下含 /print 的路径,甚至影响静態目錄命名。
- 變量名缩寫:Disallow: /*id= 想挡内部 ID 參數,但不少正常頁面也用 id 传參,容易连带被挡。
判断一條規則是否安全,最直接的方法是拿站点真實的 URL 清單去比對,而不是凭字面意思推断。
Allow 與 Disallow 的優先級
当 Allow 和 Disallow 同时命中一個 URL 时,生效的是匹配字符更長的那條;長度相同时 Allow 優先。這意味着可以用一條更具体的 Allow 把被大范围規則誤伤的入口放回来,例如:
- Disallow: /tag/
- Allow: /tag/index
但要注意,Allow 只是“在 robots.txt 层面放行”,並不等于蜘蛛一定會来抓,它仍然要经過抓取調度和抓取预算的篩選。用 Allow 做补救属于治标,把規則本身寫清晰才是治本。
排查與放行的操作顺序
- 從服務器日誌中筛出搜尋蜘蛛的請求,按狀態碼和路径归類,找出有内鏈指向却長期無抓取记錄的目錄。
- 逐條讀 robots.txt,把每條規則在一次真實 URL 样本上跑一遍,確認命中范围。
- 確認誤伤後,先缩小原規則的范围,再考虑补 Allow,避免規則越堆越乱。
- 修改後短期内观察日誌中该目錄的請求量是否恢复,不要指望立刻见效。
- 站点若有多個域名或子域,注意 robots.txt 按协议加域名加端口生效,別只改了一個。
和 Sitemap、内鏈配合
robots.txt 里可以声明 Sitemap 地址,這對 URL 發現有帮助,但前提是 Sitemap 中的 URL 本身没有被 robots.txt 挡住——两者自相矛盾时,声明反而暴露了問题。另外,Sitemap 只能补充入口,不能替代内鏈:一個只出現在 Sitemap 中、站内没有任何連結指向的頁面,抓取频率通常明顯偏低。
因此整顿顺序建议是:先修 robots.txt 的誤伤規則,再补齐站内導航與相關推荐中的入口,最後检查 Sitemap 是否覆盖了這些路径,形成以内鏈為主、Sitemap 為辅的入口结构。
robots.txt 改動的成本很低,影响面却很大。每次編輯後都建议用日誌和規則測試做一次回看,把“挡對了没有”当成固定動作,而不是等抓取量變化後才回头找原因。