在蜘蛛池和站点运营中,robots.txt 常被当成一個随手寫的“開關”。但入口頁和目标 URL 分属不同目錄、甚至不同域名时,規則很容易互相打架:入口頁允许抓取,目标 URL 却被 Disallow 掉;或者反過来,入口頁被屏蔽,連結再多也没人發現。搜尋蜘蛛到底听谁的,取决于它当时請求的是哪一個 URL。
抓取决策是按 URL 逐個做的
搜尋蜘蛛在請求某個 URL 之前,會先取對應域名的 robots.txt,再用這個 URL 自身的路径去匹配規則。它不区分“入口頁”和“目标 URL”,也不會因為入口頁允许抓取,就顺带放宽對目标 URL 的限制。入口頁的作用是提供連結线索;要不要抓目标 URL,是另一次獨立判断。所以出現規則冲突时,不存在“谁压過谁”,只有“這一條請求被放行還是被拦下”。
三種常见的規則冲突
1. 入口頁允许,目标 URL 被屏蔽
這是最典型的情况。蜘蛛正常抓取入口頁,解析出連結,但在准备請求目标 URL 时命中 Disallow,于是放弃抓取。表現上,入口頁日誌有訪問记錄,目标 URL 的日誌長期空白。需要留意的是,Disallow 阻止的是抓取,並不等于把頁面從索引中移除。此前已经被抓取收錄的頁面,仍可能留在索引里,只是内容可能逐渐變舊、缺少描述信息。
2. 入口頁被屏蔽,目标 URL 允许
這種情况下蜘蛛根本不會請求入口頁,也就無從解析里面的連結。目标 URL 即使規則上完全開放,也只是少了一條被發現的路。如果目标 URL 没有其他外鏈、sitemap 或站内入口,被發現的速度會明顯變慢,甚至長期不被發現。日誌上的特征是入口頁没有任何蜘蛛訪問记錄。
3. 目錄級通配符誤伤
像 Disallow: /*? 或 Disallow: /tmp/ 這類寫法,本意是屏蔽某一類路径,實际可能连入口頁或目标 URL 一起盖住。带參數的連結、多层目錄、大小寫不同的路径,都容易被顺带命中。規則寫得越宽,誤伤面越大,而且很难從規則文本上直接看出来。
排查顺序
- 確認目标 URL 實际用的是哪個域名的 robots.txt。跨域、子域、CDN 回源域名可能各有各的規則。
- 把入口頁 URL 和目标 URL 分別拿去對照規則,逐個路径匹配,而不是只看規則文件里有没有 Disallow 字样。
- 看抓取日誌:入口頁有没有被請求?目标 URL 有没有被請求?两邊都空,說明問题可能出在更前面,比如 WAF、DNS 或 IP 层面的限制。
- 检查是否存在 Disallow 與 noindex 同时出現的情况。這種组合下蜘蛛不抓頁面,也就看不到頁面里的 noindex,索引中的舊版本可能長期保留。
- 修改規則後观察一段時間,不要期待立刻见效。抓取节奏本身存在延迟,回訪間隔也不是固定值。
几個容易混淆的点
- Disallow 不等于刪除:它管的是抓取行為,不直接管索引结果。
- robots.txt 返回 404 或超时:多數引擎會按“允许抓取”處理,但這不代表可以放任不管,規則缺失时誤抓的風險更高。
- 403 和 Disallow 的表現不同:Disallow 下蜘蛛通常根本不發請求;403 是發了請求被拒,日誌里能看到痕迹。
- Crawl-delay 與 Disallow 是两回事:前者調节抓取速度,後者决定能不能抓。
排查這類問题时先問一句:蜘蛛此刻請求的是哪個 URL?把入口頁和目标 URL 分開看,很多看起来像“規則玄学”的現象其實一眼就能對上。
最後提醒一点,robots.txt 是各引擎自愿遵守的约定,不同引擎對通配符、大小寫、路径匹配的處理细节並不完全一致。把它当成一份需要定期复核的配置文件,而不是寫完就忘的摆设,能省掉不少反复排查的時間。