在很多站点里,robots.txt 被当成一個總開關:寫進去,頁面就消失。實际它只回答一個問题——蜘蛛能不能来抓這個路径。至于這些 URL 會不會出現在搜尋结果里,是另一套机制在管。把這两件事分開看,很多配置上的矛盾會自己解開。
robots.txt 管的是抓取,不是收錄
一條 Disallow: /private/ 的含义是“不要来抓這個目錄”,而不是“不要展示這個目錄”。如果站外有連結指向 /private/a.html,搜尋系統仍可能僅凭連結上的锚文本,把這個地址作為一個结果摆出来,只是因為没有抓到内容,标题和摘要往往很粗糙,甚至只是一串 URL。
反過来说,真正决定“能否收錄”的,是頁面本身给出的信号,比如 noindex 标簽、X-Robots-Tag 响應头,以及頁面内容與外鏈的综合判断。這些信号都需要蜘蛛先抓到這個頁面才能讀到。抓取被挡住,信号就传不出来。
Disallow 和 noindex 一起用,會互相抵消
這是最常见的一處誤配:某目錄既在 robots.txt 里被屏蔽,頁面头部又寫着 noindex。看起来是加了两道鎖,實际是第二道鎖被第一道鎖鎖在了门外——蜘蛛進不来,自然讀不到 noindex,這條指令等于没寫。最後的结果可能是 URL 依然以別的方式出現在结果里,而且你连“想让它登出”的手段都失效了。
按目标選擇做法
如果某個路径只是不想被反复抓取(比如临时文件、接口地址、日誌目錄),用 Disallow 就够了。如果目标是让某個 URL 不出現在搜尋结果里,正确顺序是:先允许抓取,再让它返回 noindex;等到確認它已经從结果中登出,再考虑用 robots.txt 挡住抓取,减少無意义的請求。
Allow 與 Disallow 的匹配顺序
一個目錄整体屏蔽、又要放行其中少數几個文件时,就需要依赖匹配規則。多數主流搜尋引擎采用“最具体的規則優先”的思路,路径寫得越長的規則越先被采纳;当两條規則長度相同时,通常 Allow 優先。不同引擎的實現细节可能有差异,寫的时候留出冗余,比赌一條邊界規則更稳。
- 規則尽量寫到具体目錄或文件名,少用一條斜杠通配整個站。
- 用了通配符和结尾符号的規則,改完之後用几组真實 URL 實际驗證一遍,不要只看規則本身。
- 規則從上往下寫不等于從上往下匹配,別按“後面的會覆盖前面”来设計。
這几類资源不要随手屏蔽
為了省抓取量,把静態资源目錄一並屏蔽,是另一種常见操作。但蜘蛛渲染頁面时需要 CSS 與 JS 才能看到完整内容,图片目錄被挡住也會影响對頁面的理解。省下来的一点請求,可能換来對頁面判断的偏差,通常不划算。
- CSS、JS、字体、图片等渲染必需资源:保持可抓取。
- 站内搜尋结果頁、篩選组合頁:這類路径容易组合出大量地址,按參數特征做限制更合适。
- CDN 或反向代理层另行設定的拦截:別和 robots.txt 的規則相互打架,两邊都要看一眼。
一份可照着做的检查清單
- 確認 robots.txt 本身能正常返回 200;返回 404 會被当作没有限制,返回 5xx 則可能让蜘蛛轉入保守狀態,减少抓取。
- 逐條問:這條規則是為了省抓取,還是為了不出現在结果里?後者不该用 Disallow。
- 检查是否誤伤了渲染所需的资源目錄。
- 在文件里寫明 Sitemap 的地址,给蜘蛛一個明确入口。
- 改完規則後翻抓取日誌,看請求量、狀態碼和抓取路径的變化,驗證是否達到预期。
robots.txt 更像是抓取入口處的交通标志,它决定蜘蛛走哪條路,但不负责把内容從结果里删掉。想做後者,得让蜘蛛進来,再听頁面自己怎么说。
把這两個层面分開管理,配置會简單很多:需要减少請求的,寫進 robots.txt;需要登出结果的,用 noindex 或响應头,並保證路径可被抓取。規則改動之後,用日誌而不是感觉来判断效果。