很多站点的 robots.txt 是几年前随手寫的,後来目錄结构調整、栏目改版,規則却没跟着動。结果要么该拦的没拦,後台和測試目錄被反复抓取;要么不该拦的拦了,分頁、静態资源甚至正常栏目被挡在门外,蜘蛛進不来,新内容自然發現得慢。這篇文章聊的是怎么把抓取范围划清楚,而不是简單地多拦一点求安心。
先分清两件事:不许抓取,和不许收錄
Disallow 的作用是阻止蜘蛛抓取某個路径,它並不等于這個頁面不會出現在搜尋结果里。如果某個 URL 從外部被連結指向,蜘蛛完全可能在没抓取内容的情况下把它放進索引,只是没有标题和摘要。反過来,想让頁面彻底不出現在结果里,通常要用 noindex,而 noindex 必须等蜘蛛把頁面抓下来、讀到這個标记之後才生效。
這两套机制方向相反,同时用會互相抵消:你 Disallow 了它,蜘蛛就讀不到 noindex;你寫了 noindex,就不该再把它拦在门外。所以第一步是問清楚目的:是不希望蜘蛛消耗抓取配額,還是不希望在结果里露出這個頁面。前者用 robots.txt,後者優先用頁面級的 noindex。
三類最常见的誤伤
静態资源目錄
把 CSS、JS、图片目錄整段屏蔽,是過去很常见的做法,理由是這些不是内容頁。但現代蜘蛛要渲染頁面才能看清連結和正文,资源拿不到,渲染出来的頁面可能残缺,内鏈也就發現不了。除非有明确的理由,否則不该拦這些路径。
分頁與列表參數
列表頁翻頁是蜘蛛顺着走、發現新内容的主要通道之一。把 page、p 這類參數一刀切屏蔽,等于把新文章的入口砍掉一截。如果确實担心參數组合太多,可以只限制無效组合,而不是把整個參數族封死。
站内搜尋頁
站内搜尋结果頁通常建议拦,因為它們會生成大量低價值 URL,還容易形成互相指向的循环。但要注意別把搜尋所在的路径和正常栏目混在一起,誤伤了内容目錄。
适合放進屏蔽列表的内容
- 後台、管理、登入、編輯類路径
- 測試目錄、临时环境、备份文件
- 带會话 ID 或跟踪參數的 URL
- 站内搜尋结果頁與篩選组合頁,视站点規模而定
- 對蜘蛛無意义的大文件下载目錄,视情况處理
拦掉之後,URL 還會被“發現”吗
會。robots.txt 只约束抓取,不约束發現。外鏈、Sitemap、其他頁面的連結仍然可能把 URL 送進蜘蛛的待抓队列,只是它不會去取内容。這意味着你可以在日誌里看到某個被屏蔽路径的抓取尝试被拒绝的记錄,這属于正常現象,不用当成故障。真正要避免的是:屏蔽了路径,却還在 Sitemap 里提交它,相当于一邊關门一邊递钥匙。
抓取频次能靠 robots 管吗
部分蜘蛛支持 Crawl-delay,但主流搜尋引擎的蜘蛛基本不把它当硬性指令,抓取节奏更多取决于服務器的响應速度和頁面质量。想控制抓取压力,靠 robots 不如靠响應時間稳定、返回碼干净来得實际。如果某個路径确實压力太大,屏蔽是可以的,但要先確認它不含需要被發現的連結。
寫規則时的几個细节
- 寫清楚 User-agent 分组,不同蜘蛛的規則不要混在一段里。
- 路径区分大小寫,寫错一個字母規則就不生效。
- 用结尾符可以精确匹配,避免前缀匹配誤伤同名前缀的目錄。
- 在文件里声明 Sitemap 地址,方便蜘蛛直接找到入口。
- 上线前在測試环境確認規則语法正确,別让整份文件失效。
上线前的检查清單
- 屏蔽路径里是否包含 CSS、JS、图片等渲染必需资源
- 是否誤拦了分頁、列表和正常栏目目錄
- 被屏蔽的 URL 是否還出現在 Sitemap 或内鏈中
- 想让它消失的頁面,是否改用 noindex 而不是 Disallow
- 規則改動後是否观察過一段時間的日誌抓取记錄
robots.txt 是一道范围邊界,不是萬能開關。它解决的是蜘蛛该不该来這里,解决不了這個頁面该不该被收錄。動手改之前先把這两個問题分開,多數誤伤都能避免。