常见問题

蜘蛛池入口頁更新後搜尋蜘蛛還抓到舊連結,缓存层该怎么排查?

入口頁的目标連結已经更新,抓取日誌里却還是舊 URL,多半是 CDN、反向代理或頁面缓存把舊版 HTML 一直發给搜尋蜘蛛。本文說明缓存键與 Vary 的影响、如何用蜘蛛 UA 對比判断是否命中舊缓存,以及清理缓存與調整入口頁 TTL 的處理顺序和邊界。

常见問题

蜘蛛池入口頁更新後搜尋蜘蛛還抓到舊連結,缓存层该怎么排查?

入口頁更新了,蜘蛛日誌里還是舊連結

不少人做蜘蛛池时,會把入口頁当成一個随时可以改動的連結中轉頁。但改完之後發現:搜尋蜘蛛的抓取日誌里,請求的還是那批老目标 URL,响應体大小也没什么變化,好像蜘蛛根本看不到新版頁面。這類情况多數和缓存层有關,而不是蜘蛛不来抓。

缓存為什么會卡住入口頁的更新

入口頁通常是纯静態或准静態的 HTML,很容易被中間的缓存层接管:CDN 邊缘节点、反向代理、對象存储的静態化規則,以及服務器上的頁面缓存插件,都可能在第一次請求後把 HTML 存起来,後續直接返回。

缓存是否命中,取决于缓存键。常见的组合是 URL + Host,有些配置還會把 User-Agent、Cookie、Query 一起算進去。一旦缓存键里带了 User-Agent,就意味着给普通浏览器 UA 的缓存,和给搜尋蜘蛛 UA 的缓存是两份。你清了普通用戶看到的那一份,蜘蛛那份可能還留在邊缘节点上。

几個容易被忽略的缓存细节

  • CDN 的 purge 如果只按 URL 提交,可能没有覆盖按 UA 分出的變体缓存。
  • 服務商提供的爬虫加速或回源優化,本质是让蜘蛛更早命中缓存,反而可能延長舊版本的生命周期。
  • 頁面里用時間戳或随机注释来判断新舊版本,但那是渲染时生成的,静態缓存的 HTML 里根本没有。
  • 入口頁被伪静態規則当成文件處理並加了長缓存头,更新时只改資料库、没動文件。

怎么判断蜘蛛拿到的是不是舊内容

先把猜测換成對比。可以按下面的顺序排查:

  1. 用搜尋蜘蛛的 UA 請求入口頁,记錄响應头里的 Age、X-Cache、ETag、Last-Modified 等字段。
  2. 用普通浏览器 UA 請求同一個 URL,把两次返回的正文、連結列表、响應体大小做對比。
  3. 翻抓取日誌,看响應体大小是否長期是同一個固定值;如果连續多天完全一致,可能不是稳定,而是缓存没更新。
  4. 在頁面源碼里加一段固定的版本标记,例如注释里的版本号,用蜘蛛 UA 抓一次,看取到的是哪個版本。

如果蜘蛛 UA 拿到舊版本、普通 UA 拿到新版本,基本可以確認是按 UA 分片的缓存造成的問题。

處理顺序與取舍

處理缓存問题时,建议按下面的顺序来,不要一上来就把整站设成不缓存。

  1. 先全量清理:確認清理范围包含按 UA、按 Query 分出的變体,而不是只清主 URL。
  2. 再調整入口頁的缓存策略:入口頁属于经常變動的頁型,可以给一個較短的 TTL,或者使用能回源校對的缓存策略,而不是和图片、CSS 一样缓存几個月。
  3. 检查 Vary 設定:如果业務上不需要按 UA 区分内容,尽量不要让 Vary 把蜘蛛 UA 單獨分成一份缓存。
  4. 清理後再次驗證:用蜘蛛 UA 重新請求,確認版本标记已经更新,再观察後續的抓取日誌。

清完缓存之後會發生什么

清理缓存解决的是蜘蛛能看到哪一版頁面的問题,不解决蜘蛛什么时候来看、看了會不會抓目标 URL。搜尋蜘蛛的回訪間隔由搜尋引擎自己决定,没有可以保證的時間表。已经進入待抓队列的舊連結,也可能仍被抓取一次或多次;把連結從入口頁移除,只是让它不再從這條路径被持續發現。

把缓存理解成影响蜘蛛讀到哪一版頁面的因素,比理解成影响收錄的開關更准确。改動之後仍需持續观察日誌,而不是指望立刻生效。

小结

入口頁更新不生效,先查缓存,再看抓取日誌。對比蜘蛛 UA 與普通 UA 的返回结果,是最直接的一步;確認問题後再决定缓存 TTL、Vary 和清理范围。做到這一层,至少能保證蜘蛛看到的入口頁,和你以為的一致。