做站点运营时,常會遇到一種情况:後台已经更新了标题或正文,自己刷新也能看到新内容,但搜尋蜘蛛抓到的還是舊版本,或者不同地区訪客看到的頁面不一致。這類問题不一定出在抓取或索引环节,很多时候是缓存层没有及时失效。
缓存的目的本来是减少服務器压力、加快訪問速度,配置合理對抓取和体驗都有帮助。但缓存策略如果不分清頁面類型和更新频率,就可能把過期内容反复返回给蜘蛛和訪客。下面從几個常见缓存层做一次自查。
先分清缓存出現在哪些位置
排查时不要只盯着一個地方,同一份頁面可能经過多层缓存:
- 浏览器缓存:通過 Cache-Control、Expires 等响應头控制,影响訪客本地复用舊文件。
- CDN 缓存:邊缘节点缓存 HTML、图片、JS、CSS,命中後不會回源。
- 反向代理或網關缓存:Nginx、Varnish 等层缓存整頁或接口结果。
- 應用层頁面缓存:CMS 或框架把渲染结果寫入文件或内存。
- 對象缓存與資料库查询缓存:缓存資料片段,更新逻辑遗漏时會輸出舊資料。
如果更新後蜘蛛仍看到舊頁面,可以按“浏览器 → CDN → 反向代理 → 應用 → 資料”的顺序逐层排查,而不是直接怀疑抓取。
更新後要检查缓存是否真正失效
内容更新不只是儲存文章,還需要触發對應缓存刷新。常见疏漏包括:
- 只清了首頁缓存,栏目頁和詳情頁仍保留舊列表。
- CDN 刷新只提交了 URL,但带參數地址或移動端地址没有覆盖。
- 對象缓存键没有随内容版本變化,更新後仍讀取舊資料。
- 浏览器缓存時間設定過長,訪客和蜘蛛長時間拿到舊文件。
- 多台服務器之間缓存不一致,回源命中不同节点。
比較稳妥的做法是:為内容更新建立固定的刷新流程,明确哪些地址需要刷新、由谁执行、多久驗證一次。對于更新频繁的栏目,可以缩短缓存時間;對于長期不變的静態资源,可以設定較長缓存並配合文件名版本号。
缓存响應头自查要点
用 curl 或浏览器開發者工具查看响應头,重点關注以下字段:
- Cache-Control:是否有 max-age、s-maxage、no-cache、private 等指令,是否與頁面性质匹配。
- Age:CDN 或代理返回的 Age 值可以判断缓存已存活多久。
- Expires:是否仍在用舊式過期時間,和 Cache-Control 是否冲突。
- ETag / Last-Modified:协商缓存是否可用,更新後是否變化。
- Vary:是否按 User-Agent、Accept-Encoding 等区分缓存,避免把移動端和桌面端混在一起。
如果 HTML 頁面設定了很長的强缓存,又缺少版本化更新机制,蜘蛛和訪客都可能反复看到舊内容。對资讯、商品、活動頁這類更新频繁的頁面,通常更适合較短的缓存時間,或者使用协商缓存。
驗證时要注意方法和邊界
驗證缓存是否刷新,不能只看自己浏览器的一次刷新。可以尝试:
- 用不同網絡或不同地区节点訪問,观察返回内容是否一致。
- 用 curl 带上缓存控制头和不带头分別請求,比較响應。
- 查看 CDN 日誌或回源日誌,確認請求是否真正到達源站。
- 對更新後的 URL 做一次强制刷新,再等待片刻复查。
也不建议為了“保證新鲜”而全站關閉缓存。缓存全部關掉後,服務器压力會明顯上升,响應變慢反而可能影响抓取效率。更合理的做法是按頁面類型分級:静態资源長缓存加版本号,列表頁和詳情頁短缓存,後台和登入態頁面不缓存。
缓存不是越少越好,而是要让该新的内容及时更新,该省的压力繼續省下来。
把缓存策略纳入日常站点运营检查,和 robots、sitemap、内部連結一样定期看一眼,能减少很多“明明更新了却像没更新”的誤會。每次改版、換服務器或接 CDN 之後,也建议重新核對一遍缓存規則。