站点运营

站点运营:頁面缓存與 CDN 回源自查,別让更新後的内容迟迟不生效

内容明明已经發布,訪客却還在看舊版本,這類反馈多半不是發布失敗,而是缓存没刷新。本文按浏览器缓存、CDN 邊缘缓存、服務端缓存、静態化文件逐层梳理,给出確認内容卡在哪一层的方法、缓存策略設定建议,以及更新内容後的固定自查動作。

站点运营

站点运营:頁面缓存與 CDN 回源自查,別让更新後的内容迟迟不生效

内容已经發布,訪客却说“還是老样子”;後台資料改了,前台價格没變;运营同学反复刷新,只有自己电脑上是新的。遇到這類反馈,先別怀疑發布流程,多半是缓存没刷新。缓存本身不是問题,問题在于我們不知道内容卡在哪一层、该在哪里清。

先把缓存的层數分清楚

一個頁面從服務器到訪客屏幕,中間可能经過好几层缓存。排查之前,先列清楚自己的站点有哪些:

  • 浏览器缓存:訪客本地儲存的副本,由响應头里的 Cache-Control、Expires 决定。
  • CDN 邊缘缓存:离訪客最近的节点,命中後不再回源,是“只有我這里變了”的常见原因。
  • 反向代理或服務端缓存:Nginx、Varnish 之類,按 URL 或規則缓存整頁。
  • 應用层缓存:對象缓存、片段缓存、模板编译缓存。
  • 静態化文件:部分站点會生成 HTML 文件直接對外,更新後需要重新生成。

层級越多,命中越快,但排查鏈路也越長。建议给自己画一張简單的图,标出每层缓存的存放位置和清理入口,出問题时不至于到處乱找。

確認内容卡在哪一层

  1. 用浏览器無痕窗口打開,或換一台设备、換一個網絡,例如從 Wi-Fi 切到手机流量。如果換網絡後内容變新,多半是 CDN 邊缘节点的問题。
  2. 用 curl -I 或開發者工具的 Network 面板看响應头,重点關注 Age、X-Cache 之類的字段。Age 數值很大,說明命中的是較舊的副本。
  3. 在 URL 後加一個随机參數再訪問。若带參數是新内容、不带參數是舊内容,基本可以确定是缓存,而不是發布失敗。
  4. 看 CDN 後台的命中率與刷新记錄,確認上一次刷新有没有真正下發到所有节点。
  5. 如果只有登入用戶看到舊内容,检查是不是把带 Cookie 的响應也缓存了。

缓存策略怎么设更省心

原則很简單:變化越频繁的東西,缓存時間越短;文件名带版本号的静態资源,可以放心缓存久一点。

  • HTML 頁面建议設定較短的 max-age,配合 ETag 或 Last-Modified 做协商缓存,让浏览器每次都能確認一下。
  • CSS、JS、图片等静態资源用内容哈希命名,設定長期缓存。更新时改文件名即可,不必反复刷 CDN。
  • 接口類請求按业務区分,涉及库存、價格、登入態的响應不要走公共缓存。
  • 更新内容後主動調用 CDN 刷新接口,把首頁、栏目頁和该篇詳情頁一起刷掉,別只刷一個。
缓存排查有一個很實用的习惯:任何一次“改完没生效”的反馈,先問清楚對方用的什么網絡、什么浏览器、是否登入,再動手清缓存。信息越具体,定位越快。

几個容易忽略的坑

  • 把 404 或错誤頁長時間缓存,導致頁面恢复後訪客仍然看到错誤内容。
  • CDN 层面忽略查询參數,把不同篩選條件的列表頁当成同一個頁面返回。
  • robots.txt、sitemap 被缓存過久,規則更新後仍需等待較長時間才生效。
  • 刷新缓存时只刷了带 www 的域名,没刷裸域或 https 版本。
  • 上线後忘了重新生成静態化文件,源站更新了、對外文件還是舊的。

更新内容时的一套固定動作

  1. 確認發布成功,先在源站直接訪問,看内容是否正确。
  2. 刷新该 URL 的 CDN 缓存,必要时按目錄前缀批量刷新。
  3. 用無痕窗口和手机流量各訪問一次,確認訪客侧看到的是新版本。
  4. 检查頁面的标题、描述、结构化資料是否同步更新,避免只改了正文。
  5. 记錄本次操作時間與涉及 URL,方便下次遇到類似問题时對照。

缓存做得對,站点會更快、更稳;做得糊涂,就會變成“我這邊好了,別人那邊没變”的反复拉扯。把每一层缓存的位置、策略和刷新入口寫進运维记錄,比临时找人清缓存要可靠得多。