不少站点在 robots.txt 里寫上一段 Disallow,就預設那部分内容從搜尋里消失了。實际情况要分開看:被禁的路径,蜘蛛通常不會去抓,但它仍然可能通過別的入口知道這些 URL 的存在。抓取和發現是两條线,混在一起判断,很容易做出错誤决策。
robots.txt 管的是抓取,不是發現
robots.txt 的規則作用于“是否去取這個 URL 的内容”。它不阻止外鏈提到這個地址,也不阻止 Sitemap 里寫下這個地址,更不阻止別人轉载你的頁面。只要 URL 被寫到了某個蜘蛛能讀到的地方,它就可能進入待抓取队列,只是在真正發起請求前被規則拦下。
所以會出現一種情况:日誌里某些被禁目錄没有抓取记錄,但搜尋结果里仍然能看到相關地址。這不是規則失效,而是發現和抓取發生在不同环节。
蜘蛛到達被禁路径时會怎么走
一個常见的路径是這样的:蜘蛛從入口頁進入,抓取一個允许訪問的列表頁,在 HTML 中找到若干連結。指向允许路径的連結會繼續排队抓取;指向被禁路径的連結,通常會被记錄為“已知但不可抓取”,本轮不再請求。
分叉点就在這里。如果列表頁本身也被 Disallow,蜘蛛可能根本到不了這個頁面,連結自然也不會被讀到。反過来,如果列表頁允许、詳情頁被禁,URL 仍然會被發現,只是内容取不到。
- 允许頁指向被禁詳情頁:URL 被發現,内容不抓取。
- 被禁列表頁指向允许詳情頁:路径在這一层断開,後面的 URL 基本没有入口。
- Sitemap 中列出被禁 URL:蜘蛛讀到地址,但同样受規則约束。
Allow 與 Disallow 的寫法會改變邊界
規則匹配不是简單的“包含即命中”,通常按路径長度做最長匹配,Allow 可以覆盖 Disallow。常见坑有几個:
- 目錄前缀誤伤:寫 Disallow: /shop 时,/shop-guide 這類同前缀路径也可能被一起挡住,需要更精确到 /shop/。
- 通配符與结尾符:$ 用于精确结尾,* 用于匹配任意字符串,滥用會让規則變得难以预测。
- 意图没寫清:先 Allow 整站再 Disallow 某目錄並不會改變顺序,但規則维護时容易互相矛盾。
运营侧可以對照检查的几件事
- 被禁目錄里是否還有需要被抓的正常頁面。如果只是屏蔽篩選參數,尽量用參數級規則,而不是整目錄封禁。
- Sitemap 里是否混入被禁 URL。這類地址會让蜘蛛反复讀到却取不到,消耗的是它的時間。
- 内鏈是否指向被禁路径。導航、面包屑、相關推荐中的這類連結,會让抓取路径在同一處分叉後断掉。
- 日誌里是否出現大量 403。因 robots 被拦通常表現為“未發出請求”,出現成片 403 更可能是 WAF 或權限配置的問题。
把 URL 發現和抓取權限分開管理
更稳妥的做法是:先用内鏈、Sitemap、提交接口保證重要 URL 被發現,再用 robots.txt 决定哪些允许被抓。两件事分開看,排查时就不會把“没被抓”和“没被發現”混為一谈。
robots.txt 只表達站点的抓取意愿,搜尋引擎是否采纳、是否收錄,由對方决定。調整規則後,建议用日誌观察一段時間再判断效果。