常见問题

入口頁被 CDN 缓存住,搜尋蜘蛛看到的還是舊連結怎么办

入口頁更新了連結,搜尋蜘蛛却一直抓到舊版本 HTML,多數是 CDN 或反向代理缓存造成的。本文說明如何用响應头、日誌和源站對比確認缓存問题,给出缓存策略、主動刷新和分层排查的具体做法,並說明哪些情况下不需要改缓存。

常见問题

入口頁被 CDN 缓存住,搜尋蜘蛛看到的還是舊連結怎么办

蜘蛛池入口頁的职责是让搜尋蜘蛛不断發現新的目标 URL。如果入口頁前面挂了 CDN 或反向代理,缓存策略没配好,搜尋蜘蛛拿到的可能一直是几天前那份 HTML,新加的連結根本没机會被看到。這通常不是蜘蛛池本身失效,而是缓存层把請求挡在了源站外面。

缓存為什么會卡住 URL 發現

CDN 和反向代理一般會按路径、查询串缓存頁面,部分配置還會按 UA 或 Cookie 区分版本。入口頁連結更新後,源站内容變了,但邊缘节点上的副本還在 TTL 内,請求直接返回舊 HTML。搜尋蜘蛛拿到舊頁面,自然只能看到舊連結。

典型表現是:自己在浏览器里刷新能看到新連結,日誌里搜尋蜘蛛的抓取记錄也有,但目标 URL 迟迟不進抓取队列。

先確認是不是缓存導致

  1. curl -I 請求入口頁,看响應头里有没有 AgeX-CacheCF-Cache-Status 之類字段。有 Age 且數值較大,基本可以判定命中缓存。
  2. 對比源站和 CDN 返回的 HTML 長度或内容哈希,不一致就說明拿到的是缓存副本。
  3. 把搜尋蜘蛛的 UA 單獨拿出来請求一次,看是否返回了另一份内容,有些配置對爬虫走了單獨的缓存規則。
  4. 翻訪問日誌,確認搜尋蜘蛛抓到的版本和源站目前版本對應不上。

缓存可能不止一层

從搜尋蜘蛛到源站,中間可能经過 CDN 邊缘节点、CDN 中間层、源站前面的 Nginx proxy_cache,甚至應用自身的頁面缓存。只清掉一层,剩下的层還會返回舊内容。排查时按請求鏈路逐层驗證:先看邊缘节点响應头,再绕過 CDN 直连源站 IP 請求,最後检查應用层有没有單獨缓存入口頁。

調整方向

  • 入口頁不缓存或短缓存。把 Cache-Control 设成 no-cache 或很短的 max-age,让邊缘节点频繁回源。
  • 更新後主動刷新。每次改完連結就調用 CDN 的刷新接口清掉入口頁缓存,別等 TTL 自然過期。
  • 動態頁和静態资源分開。图片、CSS 可以長缓存,入口頁 HTML 保持回源。
  • 避免按 UA 分版本。给搜尋蜘蛛單獨返回一份内容容易踩到 cloaking 的邊界,维護成本也高。
  • 連結更新走固定流程。先刷新缓存,再確認回源内容正确,最後才看日誌里的抓取记錄。

哪些情况不用動缓存

如果入口頁本身几乎不更新,連結長期固定,缓存反而能降低源站压力,這时没必要强行回源。判断标准很简單:入口頁的連結集合是否還在變化。不再變化,缓存就是帮手;還在频繁增删,缓存就是阻力。

两個常见誤区

  • 把缓存当成唯一原因。缓存清了目标 URL 還是没動静,說明問题在連結可抓取性、robots 規則或目标頁响應狀態上。
  • 為了绕過缓存给搜尋蜘蛛單獨開一份内容。短期可能看到抓取變化,長期風險不小,也不容易维護。
入口頁的重点不是内容多新鲜,而是搜尋蜘蛛每次来能不能看到目前的連結集合。缓存让這两者脱节时,排查優先級要排在改模板前面。

改完之後怎么看效果

調整後不要立刻下结论。观察一到两周日誌,看搜尋蜘蛛抓入口頁时返回的 HTML 是否已经是最新版本,目标 URL 有没有出現首次抓取记錄。如果入口頁抓取正常、内容也是最新的,但目标 URL 依然没有動静,那問题在別處,需要回到連結可抓取性、robots 規則和目标頁响應狀態上繼續排查。