常见問题

蜘蛛池入口頁被 CDN 缓存成舊版本,搜尋蜘蛛抓到過期連結怎么办

入口頁連結已经更新,搜尋蜘蛛却一直抓到舊版本内容,這種情况多半出在 CDN 或反向代理缓存上。本文說明如何用响應头確認缓存命中、缓存為什么會把舊連結繼續喂给搜尋蜘蛛,以及清缓存、調 TTL、改缓存規則的先後顺序。

常见問题

蜘蛛池入口頁被 CDN 缓存成舊版本,搜尋蜘蛛抓到過期連結怎么办

蜘蛛池入口頁最容易踩的一個坑,不是連結寫错了,而是連結改對了、搜尋蜘蛛却還是按老版本抓。表現通常是:你在入口頁新增或替換了一批目标 URL,過一段時間去看日誌,搜尋蜘蛛訪問的仍然是几天前甚至更早的那批連結。這種时候不要急着怀疑蜘蛛池本身失效,先把缓存這一层排掉。

一、怎么確認是缓存而不是別的

判断方法很简單:同一时刻對同一個入口頁 URL 發几次請求,比較返回的 HTML 内容是否一致,再和源站直连的结果對比。如果源站已经更新,走域名訪問拿到的還是舊 HTML,基本可以确定是 CDN、反向代理或對象存储缓存层在起作用。

看响應头

  • Age:大于 0 說明這份响應来自缓存,數值是它在缓存里待了多少秒。
  • X-Cache、CF-Cache-Status、X-Cache-Status 一類的字段:HIT 表示命中缓存,MISS 表示回源。
  • Cache-Control、Expires:决定缓存能存活多久,也就是你更新後要等多久才生效。
  • Last-Modified、ETag:和源站對比是否一致,能看出這份 HTML 到底是哪個版本。

換 UA 再测一次

有些缓存配置會把搜尋引擎 UA 單獨分流。用普通浏览器 UA 和常见的搜尋蜘蛛 UA 各請求一次,看返回内容和缓存狀態是否相同。如果两者不同,說明缓存規則里有按 UA 分版本的處理,這一层要單獨查。

二、缓存為什么會把舊連結繼續喂给搜尋蜘蛛

常见原因有三個。一是缓存键只看 URL,不看内容版本,只要 TTL 没到期就一直返回舊 HTML;二是回源失敗时啟用了“過期内容繼續提供”的策略,源站明明已经更新,缓存却因為回源超时把舊副本又吐了出去;三是多台邊缘节点各自缓存,你只刷新了其中一台,其他节点還在用舊副本。

對搜尋蜘蛛来说,後果不是“抓不到”,而是“抓到的是已经不存在的連結”。舊 URL 如果已经下掉,蜘蛛跟過去就是 404 或 410,等于把有限的抓取額度花在了废連結上,新連結的發現時間則被整体推後。

入口頁這類頁面更新频繁,通常不适合設定長缓存。把它当成需要即时生效的頁面来配置,比事後反复清缓存省事得多。

三、按這個顺序處理

  1. 先清缓存,刷新全部邊缘节点,不要只刷一台。
  2. 確認源站返回的已经是新 HTML,再去看缓存层是否同步。
  3. 检查缓存規則里 HTML 的 TTL。入口頁建议用較短的缓存時間,或者對 HTML 直接不缓存。
  4. 確認回源失敗时的兜底策略,關掉長期提供過期副本的選項。
  5. 更新完成後重新對入口頁發起一次抓取請求,看响應头里的缓存狀態和内容版本。

四、改配置时不要踩的两個坑

  • 不要為了搜尋蜘蛛單獨返回一份不一样的内容。按 UA 给蜘蛛定制頁面容易被判定為作弊,而且一旦風控命中,损失比缓存舊連結大得多。
  • 不要给 HTML 加上很長的 Cache-Control: max-age。搜尋蜘蛛會參考缓存头来决定多久之後再来,長缓存等于主動让它晚点回訪。

五、長期怎么减少這類問题

把入口頁和静態资源分開配置缓存策略:图片、CSS、JS 可以長期缓存,HTML 尽量短缓存或不缓存。每次批量更新連結之後,顺手做一次缓存刷新,並记錄目前時間,方便之後對照蜘蛛訪問日誌里的内容版本。如果入口頁是程序化生成、更新频率很高,可以從一開始就不走缓存,用性能換准确性,對抓取發現来说通常更划算。

最後提醒一句,缓存排查只能保證搜尋蜘蛛看到的是最新内容,不能保證它一定抓取或收錄。它解决的是“蜘蛛来了却看到舊頁面”這類問题,剩下的還是取决于入口頁本身的可抓取性和目标頁的质量。