很多站点把 robots.txt 当成一個“優化開關”,其實它更像抓取入口上的一道门。寫對了,蜘蛛不會把時間耗在没意义的地址上;寫错了,本该被抓到的頁面可能连請求都收不到。下面按“它管什么、怎么寫、怎么分放行和拦截、改完怎么看”四個部分说。
robots.txt 管的是抓取,不是收錄
robots.txt 的規則作用在抓取环节。被 Disallow 的 URL,蜘蛛通常不會去請求,自然也拿不到頁面内容。這里有两個容易被忽略的点:一是被拦住不等于一定不會被索引,如果別處有指向它的連結,地址本身仍可能出現在结果里,只是缺少摘要信息;二是“希望它別被收錄”的正确做法,一般是放行抓取、让頁面返回 noindex,而不是直接在 robots 里拦掉。
拦掉一個頁面,同时也拦掉了它身上的 noindex。想让蜘蛛看到“別收錄”的指令,前提是它能抓到頁面。
寫法上的几個關键点
User-agent 與分组
每個規則组以 User-agent 開头,可以寫具体蜘蛛名,也可以用 * 匹配其余蜘蛛。同一文件里可以有多组,但一组内不要混寫多個 User-agent 再配一堆含义不一致的規則,容易产生理解偏差。多數搜尋引擎蜘蛛只認自己那一组或 * 组。
Disallow 與 Allow
Disallow 表示不允许抓取的路径前缀,Allow 用来在已拦截的范围里開一個口子。主流蜘蛛的常见規則是路径更長、更具体的優先。典型寫法是先拦掉整個目錄,再用 Allow 放行其中一個子路径。
- Disallow 後留空表示不限制,基本等于全部放行。
- 只寫 Disallow: / 會把整站挡在外面,除非确實想這样。
- 路径区分大小寫,/Search 和 /search 在部分實現里並不等價。
- 结尾不加斜杠时含义不同,/admin 會同时匹配 /admin 和 /administrator。
通配符的用法
* 匹配任意字符,$ 表示路径結束。例如用 /*?sort= 拦住带排序參數的地址,用 /*.pdf$ 拦住以 .pdf 结尾的文件。通配符別放得太宽,否則容易誤伤正常内容頁。
哪些地址适合放行,哪些适合拦
建议放行
- 正常的内容頁、栏目頁、詳情頁
- 承载内容與排版的 CSS、JS 和图片
- Sitemap 文件本身
通常建议拦截
- 後台、登入、編輯、草稿類地址
- 站内搜尋结果頁,尤其是带查询參數的
- 购物车、下單、支付流程
- 會话 ID、跟踪參數生成的重复地址
- 測試环境、临时目錄、备份文件
判断标准可以很简單:這個地址被蜘蛛抓到之後,除了消耗抓取,還能带来什么。如果它不會作為落地頁出現,也没有指向有價值内容的連結,拦掉通常更划算。
容易踩的几個坑
- 拦掉了 CSS 和 JS,蜘蛛拿不到样式和渲染所需脚本,看到的頁面可能是残缺的。
- 在 robots 里拦掉頁面,同时又指望该頁面的 noindex 生效,两個指令互相矛盾。
- 上线时用 Disallow: / 做临时遮挡,後来忘了刪除,站点長期處于被挡狀態。
- 在規則组里寫 Crawl-delay,但蜘蛛不一定遵循,別把它当成真正的限速開關。
- robots.txt 本身返回 404 或 5xx,蜘蛛在拿不到規則时的處理各不相同,都不理想。
- Sitemap 声明寫成相對路径或错誤域名,抓取指引等于没寫。
改完之後怎么驗證
修改 robots.txt 不需要手動“提交”,但要確認它生效。可以做的几件事:直接用浏览器訪問 /robots.txt,確認返回碼和内容;用搜尋引擎提供的 robots 測試工具检查某條 URL 是被放行還是被拦;對比改前改後的服務器日誌,看被拦路径的請求量是否下降、内容頁的抓取是否更集中。生效存在延迟,蜘蛛可能還會按舊規則再跑一段時間。
最後提醒一句,robots.txt 只是抓取入口的控制手段,它不决定頁面能不能被收錄,也替代不了内鏈、Sitemap 和内容本身。把它当成“让蜘蛛少走冤枉路”的工具来用,比指望它解决所有抓取問题更現實。