内容明明改過了,蜘蛛来抓的时候拿到的却還是舊版本——這種情况在用了 CDN 或整頁缓存的站点上並不少见。蜘蛛不會主動“刷新”,它只是請求一個 URL,服務器返回什么,它就按什么理解。
缓存為什么會挡住更新
缓存的本意是减少源站压力,让用戶更快拿到頁面。但缓存有自己的過期策略:有的按固定時間過期,有的在發布新内容时主動清理,有的只能手動刷新。如果策略没配好,或者内容更新後没有触發清理動作,蜘蛛和用戶拿到的就都是舊副本。
更麻烦的是一種“半更新”狀態:頁面 HTML 已经刷新,但它引用的 CSS、JS 或图片還是舊版本,導致渲染異常;或者列表頁刷新了、詳情頁没刷新,蜘蛛沿着列表点進去,看到的仍然是老内容。
先分清站点上有几层缓存
CDN 與反向代理层
這一层离蜘蛛最近,多數請求會先命中 CDN 邊缘节点。需要確認三件事:缓存規則是否覆盖了 HTML 頁面、過期時間设了多長、是否支持按 URL 主動刷新或按标簽批量刷新。如果 HTML 被缓存了一整天,那這一整天里更新的内容都不會出現在蜘蛛眼前。
應用层的整頁缓存
不少 CMS 會把渲染好的頁面存成静態文件或缓存條目。在發布、修改、刪除内容时,應该同步清理對應頁面的缓存,也要清理首頁、栏目頁、标簽頁、Sitemap 這些會被間接影响的頁面。只清詳情頁、忘了清列表頁,是很常见的疏漏。
對象缓存與資料库查询缓存
這一层通常不影响蜘蛛看到的最终 HTML,但如果清理不彻底,頁面内容可能出現错位,比如标题是新的、正文還是舊的。發布流程里如果有多步操作,值得检查清理動作是否放在了所有寫入完成之後。
一份可执行的自查清單
- 找一两個近期更新過的頁面,用無痕模式請求,再和服務端實际内容比對,確認返回的是新内容還是舊内容。
- 查看响應头里的缓存相關字段,關注 Age 的數值。Age 很大,說明這份缓存已经放了很久,蜘蛛多半也拿到的是同一份。
- 確認發布或更新内容时,是否有自動清理缓存的動作;如果没有,站点是否有一條明确的手動刷新流程。
- 检查 Sitemap 和頁面上的最近更新時間,是否與真實修改時間一致,避免内容改了但時間戳没動,让蜘蛛判断不出變化。
- 检查首頁、栏目頁、聚合頁的“最新内容”模块,它們往往也被一起缓存住了。
- 检查静態资源是否带版本号或文件指纹,避免替換了文件但 URL 没變,導致舊资源繼續被引用。
更新内容时的操作顺序
比較稳妥的顺序是:先完成内容修改與审核,再清理相關頁面缓存(包含列表頁和 Sitemap),然後確認静態资源版本已更新,最後驗證线上返回的确實是新内容。不要指望蜘蛛下次抓取时“自己看到”新版本,它看到的永遠是你返回给它的那一份。
缓存不是不能開,而是要在“快”和“新”之間做個明确取舍。更新频繁的栏目可以把過期時間设短一些,几乎不變的頁面设長一些也没問题,關键是這個取舍是你主動做的,而不是預設配置决定的。
监控與驗證
可以在服務器或 CDN 侧保留命中率與刷新记錄,定期抽查重要頁面的實际返回内容。也可以设一個固定的监测任務,定时請求几個核心 URL,比對關键文字是否發生變化——這比等着發現異常要主動得多。
缓存問题往往不报错,只會安静地让蜘蛛和用戶看到舊版本。把它放進例行自查,比出問题後再翻日誌要省力。