缓存是站点加速的常規手段,但它同时也是抓取环节里最容易出問题的部分。CDN、反向代理、頁面缓存插件、對象存储,只要有一层配置不当,蜘蛛或訪客就可能拿到几小时甚至几天前的頁面、错誤的狀態碼,或者一個本该登入後才可见的内容。這類問题往往不容易被察觉,因為你在浏览器里刷新一下看到的是新内容,而缓存节点上還留着舊版本。
缓存為什么會干扰抓取
搜尋引擎蜘蛛請求頁面时,看到的通常是缓存节点的响應,而不是源站。如果缓存层没有正确区分請求来源、没有透传源站返回的头部信息,就會出現几種典型情况:
- 頁面已经更新,但缓存仍返回舊 HTML,蜘蛛判断内容未變化,减少後續訪問;
- 源站返回 404 或 500,缓存层却用舊的 200 頁面兜底,形成软 404;
- 带參數的地址被缓存成同一個键,不同内容互相覆盖;
- 登入態、地区、語言等差异化内容被统一缓存,用戶看到错誤版本。
自查要点
1. 缓存头是否合理
检查源站返回的 Cache-Control、Expires、ETag、Last-Modified。HTML 文档不建议設定過長的强缓存,通常用較短的 max-age 配合协商缓存更稳妥;图片、字体、JS/CSS 這類带指纹的静態资源可以设長一些。注意 CDN 自身的缓存規則可能覆盖源站头部,两邊要對照着看。
2. 狀態碼是否被缓存
404、410、301、5xx 是否進入了缓存,是常见盲区。一次源站抖動产生的 5xx 如果被缓存几十分钟,蜘蛛和訪客都會看到错誤頁面。建议在 CDN 侧明确哪些狀態碼不缓存,或只缓存极短時間。
3. 缓存键是否過粗或過细
键太粗,忽略 UA、語言、登入態,會把不同内容混在一起;键太细,把随机跟踪參數都算進去,命中率接近零,回源压力反而更大。可以先梳理站点實际需要的区分维度,再做取舍。
4. 刷新與预热流程
内容發布後是否自動刷新對應 URL,栏目頁、列表頁、首頁是否在刷新范围内,這些都需要在流程里寫清楚。只刷新詳情頁,列表頁仍顯示舊标题,蜘蛛顺着列表走就會拿到過期連結。
上线後的检查動作
- 用命令行請求目标 URL,观察响應头里的 Age、X-Cache、Cache-Control 等字段;
- 對比源站直连與经過 CDN 两條路径返回的 HTML 是否一致;
- 抽查已發布的新内容,確認列表頁、詳情頁、站点地图里的連結都是新地址;
- 把缓存異常纳入日常监控,比如 5xx 比例、回源率、命中率的突變;
- 改版或批量更新时,提前確認缓存刷新方式,避免舊頁面長期残留。
缓存的目标是减少重复回源,不是让内容“冻”在原處。凡是會影响抓取判断的头部和狀態碼,都值得單獨確認一次。
缓存策略没有统一答案,頁面類型、更新频率、服務器承载能力不同,取舍也不同。但只要把缓存头、狀態碼、缓存键和刷新流程這四項固定下来定期核對,就能减少“蜘蛛看到的是舊版本”這類問题带来的运营困扰。