robots.txt 放在站点根目錄,是蜘蛛進入站点前第一眼會看的文件。它通常只有几十行,平时没人動,改版、測試、域名迁移时才被想起来。也正因如此,它是最容易埋雷的地方之一:一行規則寫错,可能让整站或整批栏目從抓取队列里消失,而頁面上看不出任何異常。
先弄清它能做什么
robots.txt 是一份约定,主流搜尋引擎會遵守,但它不是訪問控制,也不是安全措施。不要指望把後台地址、内部測試頁寫進去就等于藏起来了——這個文件本身是公開可讀的,任何人訪問 /robots.txt 都能看到你列出的路径,等于主動交出一份目錄清單。
它主要做两件事:告诉蜘蛛哪些路径不建议抓取,以及站点地图放在哪里。至于頁面是否進入索引,更可靠的手段是頁面級的 meta robots 标记或 noindex 响應头。
常见的几種誤伤
從根目錄開始的整站屏蔽
測試环境里习惯性寫着 Disallow: /,上线时忘记删掉。表現是蜘蛛仍然會来,但几乎不抓内容,日誌里反复出現的只有對 robots.txt 的請求。這類事故排查起来並不难,难的是發現得晚。
通配符用得太宽
Disallow: /*? 本意是挡掉带參數的篩選頁,结果把大量通過參數正常訪問的栏目頁一起挡了。更稳妥的做法是把規則收窄到具体路径下的特定參數,而不是全站一刀切。每加一個通配符,都要想清楚它實际能匹配到多少條 URL。
顺带屏蔽了资源目錄
把 /js/、/css/、/images/ 一並寫進 Disallow,頁面渲染和图片搜尋都會受影响。現在搜尋引擎需要抓取样式和脚本才能還原頁面内容,除非確認某個目錄里只有與頁面無關的素材,否則不要屏蔽它們。
把匹配方向理解错了
robots.txt 的路径是從根開始的前缀匹配,不是關鍵詞匹配。寫 Disallow: /news 會连带挡掉 /news-list、/newspaper 這類同前缀路径,並不管它們是不是真的在 /news 目錄下。要精确到目錄,记得补上结尾斜杠;要放開個別文件,就用對應的 Allow 行單獨寫出来。
規則冲突时谁说了算
当 Allow 和 Disallow 同时命中一條路径时,通常按匹配字符更長的那條执行;長度相同时,Allow 優先。但不同引擎的實現细节存在差异,與其依赖優先級,不如把規則寫清楚,避免互相覆盖,也避免以後自己都看不懂当初為什么這么寫。
寫完一段規則,自己拿几條典型 URL 還原一遍:它會命中哪几行?最终结果是允许還是屏蔽?想不明白的規則,就是有風險的規則。
上线前後的检查動作
- 直接訪問 /robots.txt,確認返回 200,且内容是最新版,不是缓存或舊部署留下的版本。
- 用搜尋引擎官方提供的 robots 測試工具,輸入几條典型 URL,看判定结果是否符合预期。
- 分环境管理:測試站與线上站使用不同的配置模板,避免測試規則被带到线上。
- 声明站点地图:在文件末尾寫上 Sitemap 的完整地址,方便蜘蛛顺着找到入口。
- 观察服務器日誌:如果内容頁的抓取量突然下降,而 robots.txt 的請求一切正常,先回来查規則。
什么时候该改,什么时候別動
域名迁移、目錄结构調整、關閉某個频道、上线大批量篩選頁,這些场景需要動 robots.txt。每次修改後留一份變更记錄,寫明改了什么、為什么改、什么时候生效,出問题时能快速回滚。日常没有明确目标时,不要顺手改它。
最後一個容易被忽略的顺序問题:如果某個頁面只是不想被索引,但還需要蜘蛛讀到頁面里的 noindex 标记,就不要用 robots.txt 把它挡在门外——被挡住的蜘蛛讀不到頁面中的任何指令。两種手段用错顺序,往往就是「頁面明明寫了不索引却還是被收錄」,或者「想删掉的頁面怎么也删不掉」的根源。