網站上线新内容、改了标题或替換了图片,自己在後台明明看得见,訪客和蜘蛛抓到的却還是几天前的版本——這類問题很多时候不是部署失敗,而是缓存层没刷新干净。CDN、反向代理、對象存储、浏览器缓存,甚至框架自带的頁面缓存,任意一层留下舊副本,都會让“更新”變成“看起来没更新”。
缓存問题為什么容易被誤判
缓存的设計目标就是少回源、快响應,所以它天然倾向于把舊内容多留一會儿。运营侧的直觉是“我改完就该全網一致”,工程侧的現實是“每层缓存有自己的過期時間和失效條件”。两端预期不一致,就會出現反复的排查拉扯:运营说改了,技術说源站上是新的,最後發現問题出在邊缘节点或浏览器本地。
值得逐項確認的几個点
缓存键與參數處理
缓存键决定了哪些請求算作同一個頁面。带查询參數的 URL、大小寫差异、结尾斜杠、编碼头差异、Cookie 差异,都可能被算成不同缓存對象,也可能被错誤地合並。需要確認:带推廣參數的訪問不會被当成獨立副本反复回源,同时也不會因為忽略關键參數,把不该共用的内容混在一起。
TTL 與分层過期
HTML、接口响應、静態资源通常不该共用同一個 TTL。HTML 适合較短過期加主動刷新,带指纹的静態资源可以長過期。如果所有類型一刀切,要么更新慢,要么回源压力大。
HTML 被長時間缓存的風險
把整頁 HTML 長期缓存,是改版和栏目調整时最容易出問题的地方。頁面结构、内鏈、甚至标题都可能長期停留在舊版本,蜘蛛抓到的自然也是舊版本。相對稳妥的做法是让 HTML 保持較短缓存,並在發布时主動提交刷新,而不是等它自然過期。
刷新是否真的生效
提交刷新之後需要實际驗證:用不同網絡、無登入狀態的方式請求同一個 URL,對比返回内容里的版本标识或時間戳,而不是只看後台预览頁面。预览正常不代表邊缘节点已经是新版本。
一次可执行的自查流程
- 列出站点涉及的所有缓存层:浏览器、CDN、反向代理、應用层缓存、對象存储。
- 為每层记錄目前策略:缓存键怎么算、TTL 多長、是否缓存 HTML、是否忽略查询參數。
- 挑一個刚更新過的頁面,用未登入浏览器和無痕窗口分別訪問,记錄返回的版本特征。
- 發布一次小改動,观察各层在多長時間内變成新版本,记錄實际生效時間。
- 對長期没動的栏目頁、专题頁做抽查,確認没有停留在舊模板结构上。
- 把刷新動作寫進發布清單:谁提交、多久後驗證、異常时怎么回滚。
常见誤区
- 只用强刷判断:本地强刷只绕過浏览器缓存,绕不過 CDN 和應用层缓存。
- 依赖時間被動過期:需要紧急修正错誤内容时,等 TTL 自然到期並不合适。
- 忽略回源压力:一次性刷新全站,可能把請求集中打到源站。
- 把缓存和索引混為一谈:蜘蛛抓到舊版本,不一定是索引没更新,也可能是它拿到的就是舊副本。
把“更新生效”当成一個需要驗證的流程,而不是一個預設结果,缓存引發的返工能少掉一大半。
把驗證變成固定動作
缓存策略不需要频繁調整,但有几個时机值得重新確認:站点改版、更換 CDN 或對象存储、調整 URL 结构、上新模板,以及出現内容事故之後。每次確認留下简短记錄,後續交接和排查都會省力。對搜尋蜘蛛来说,稳定的响應比极致的速度更重要——让同一個 URL 在不同時間返回可预期的内容,本身就是在降低抓取和發現环节的不确定性。