日常运维里,“這個頁面不想被搜到”经常被一句话带過,然後在 robots.txt 里加一行 Disallow,或者在頁面里加一個 noindex,甚至两個一起上。两種做法看起来都能達到目的,但蜘蛛在這两種情况下走的路径完全不同,出問题的概率也不一样。
两個指令作用在不同的环节
可以把抓取過程粗略拆成两段:取回頁面和决定是否把頁面放進索引。robots.txt 管的是前一段,它告诉蜘蛛哪些路径不必来取;noindex 管的是後一段,頁面已经被取回,蜘蛛讀到了這個标记,于是不把它作為可展示的搜尋结果。
所以嚴格说,robots.txt 挡的是“抓”,noindex 挡的是“收”。這两件事混在一起谈,就容易做出自相矛盾的配置。
生效时机:一個在請求之前,一個在請求之後
Disallow:請求還没發出就結束
蜘蛛開始工作前,通常會先取一次 robots.txt,按里面的規則判断队列中的 URL 能不能抓。被 Disallow 命中的 URL,請求一般不會發出,服務器日誌里也就看不到這條记錄。但要注意:URL 依然可能被“發現”——比如別的站鏈過来,或者你自己在別處提到它。蜘蛛知道這個地址存在,只是不去取。
noindex:頁面已经取完才生效
noindex 寫在 HTML 的 meta 标簽里,或者放在 HTTP 响應头 X-Robots-Tag 里。蜘蛛必须先把頁面抓下来,才讀得到這條指令。如果是靠 JavaScript 渲染出来的 meta,還得等渲染這一步完成。
換句话说,noindex 頁面會被抓取,只是不以正常结果出現在搜尋里。它消耗的抓取资源是真實存在的,訪問日誌里也看得见。
一個常见的坑:既在 robots.txt 里 Disallow 這個路径,又在頁面里寫 noindex。蜘蛛被挡在外面,讀不到 noindex,于是這個 URL 有可能只凭連結信息被收錄成一條没有摘要的结果。
一條 URL 走完的决策鏈
- 蜘蛛從外鏈、内鏈、Sitemap 等入口發現 URL。
- 取 robots.txt,判断该路径是否允许抓取。
- 允许抓取則進入抓取队列,按權重和频率安排請求。
- 取回頁面,讀取狀態碼、响應头和 HTML 里的指令。
- 结合 noindex、canonical 等信号决定是否進入索引,以及以哪個 URL 為准。
任何一步出問题,最终结果都可能和预期不同。比如 robots.txt 讀取失敗返回 5xx,不同引擎的處理策略不完全一样,有的會暂时收紧抓取范围,直到能正常讀取為止。
怎么選:先想清楚你要的是什么
- 只是不想让蜘蛛把時間花在某些路径上(後台、站内搜尋结果頁、大量參數頁面):用 robots.txt。
- 希望頁面能被讀到,但不想出現在搜尋结果里:用 noindex,並且不要用 robots.txt 挡住它。
- 非 HTML 文件(PDF、图片、XML)寫不了 meta:用 X-Robots-Tag 响應头。
- 整站临时下线:返回 503 通常比一刀切 Disallow 更合适,恢复後也更容易被重新抓取。
- 已上线頁面要彻底移除:先 noindex 並等蜘蛛抓過一轮,再考虑 301 或 410,顺序反了容易留下長期不更新的快照。
日常检查清單
改動 robots.txt 之後,建议在日誌里對照看几天:原本有抓取记錄的路径是否消失,消失的是否正是你想挡的。如果某個重要目錄突然没有蜘蛛訪問,先检查是不是規則寫宽了。
對于 noindex 頁面,可以用抓取測試類工具確認蜘蛛看到的响應和你的源站一致——特別是那些依赖前端渲染的頁面,源 HTML 里没有 meta,就別指望蜘蛛一定讀得到。
Sitemap 里尽量不放被 robots.txt 屏蔽的 URL,這類清單對抓取没有帮助,還會让有限的抓取预算花在不该花的地方。