做站点维護时,robots.txt、meta robots 和响應头里的 X-Robots-Tag 经常被放在一起讨论,因為它們看起来都在表達“別管這個頁面”。但三者管的环节並不相同:一個决定爬虫要不要来抓,另外两個决定抓到的内容要不要進索引。把顺序用反,頁面往往既没有按预期從索引里消失,又在很長一段時間里失去了被抓取的机會。
抓取屏蔽和索引屏蔽,不是一回事
- 抓取屏蔽:禁止爬虫請求某個 URL 或目錄,頁面内容不會被讀取。
- 索引屏蔽:允许爬虫讀取頁面,但要求不要把内容放進索引、不要展示摘要或快照。
這里有個容易被忽略的前提:noindex 寫在 HTML 里或者响應头里,爬虫必须先完成抓取才能看到它。如果同一批 URL 已经在 robots.txt 中被禁止抓取,爬虫不會去取頁面,也就讀不到 noindex,索引里的舊记錄可能長期留着。這就是“想删頁面,结果只挡住了抓取”的典型场景。
三個指令的作用位置
robots.txt
文件放在站点根目錄,按 User-agent 加 Disallow 的規則控制抓取范围,作用于整站或整個目錄,粒度粗但生效早。它的優点是节省抓取资源,代價是被挡住的 URL 無法通過頁面内的指令再做調整。
meta robots
寫在單個頁面的 head 里,可以精细到“這個頁面不索引,但連結可以繼續跟”。适合處理單個頁面或某類模板頁,前提是爬虫能正常抓到這個頁面。
X-Robots-Tag
通過 HTTP 响應头下發,作用范围與 meta robots 類似,但能覆盖非 HTML 资源,比如 PDF、图片,也能在無法修改頁面模板时由服務端统一控制。多個来源同时出現时,限制更强的指令通常會被優先采用。
几種常见的错位寫法
先封抓取,再等索引掉
想让一批頁面從索引里登出,正确顺序是先放開抓取,让爬虫能讀到 noindex,等索引狀態更新之後,再决定是否需要收紧抓取。反過来操作,等于把一個爬虫看不到的指令留在原地。
把 noindex 用在需要被抓的頁面上
有些頁面希望站内連結繼續被跟踪、传递信号,却不希望自己出現在结果里,這时用 noindex 是合适的;但如果在 robots.txt 里直接屏蔽,連結關系也會一並断掉。
忽略响應头的覆盖面
服務端统一加了 X-Robots-Tag,前端又單獨给某個目錄配置了放開規則,两邊就容易互相打架。改版、CDN 迁移、反向代理配置之後,建议重新確認一次响應头。
自查顺序
- 先用抓取工具或日誌確認目标 URL 的實际响應狀態與响應头,別只看後台配置。
- 检查 robots.txt 是否屏蔽了這些 URL;如果屏蔽了,先判断是“确實不想被抓”還是“只是想让頁面登出索引”。
- 確認這條規則的语法是否寫得過宽,比如誤把整個目錄或带參數的路径都包含進去。
- 检查頁面 head 與响應头中的 robots 指令,看是否存在冲突或重复下發。
- 對已经被屏蔽抓取的頁面,先放開、再让爬虫讀到 noindex,等待狀態更新後再收紧。
- 记錄修改時間和预期狀態,過一段時間對照索引狀態报告复查,而不是改完就当完成。
怎么選更稳妥
- 整站或大目錄下大量低價值 URL、且不關心它們的連結關系:robots.txt 更省抓取资源。
- 單個頁面要從索引移除,同时希望保留站内連結结构:noindex。
- 非 HTML 文件、或頁面模板無法改動:X-Robots-Tag。
- 只是不想展示摘要或快照,而不是不想收錄:用 nosnippet、noarchive 這類更细的指令,別直接上 noindex。
判断标准很简單:先問“這個 URL 我還需不需要被抓”,再問“抓到了要不要用”。第一個問题的答案决定用不用 robots.txt,第二個問题的答案决定用不用 noindex。
把這三层指令当成一個有先後顺序的流程来看,大部分“改了没反應”的問题都能對上原因。真正的难点不在记语法,而在于每次改動前先想清楚目标是抓取层面還是索引层面,改完再留一個复查节点。