站点运营

站点运营:CDN 與缓存自查,別让蜘蛛抓到改動前的舊頁面

CDN 和缓存决定了蜘蛛實际讀到什么。本文梳理 HTML 缓存时長、静態资源版本指纹、404 與 301 狀態碼缓存、缓存键與查询參數等自查点,並给出發布後的刷新流程與驗證方法,帮助站点运营把源站改動及时传递给抓取端。

站点运营

站点运营:CDN 與缓存自查,別让蜘蛛抓到改動前的舊頁面

做站点运营时,URL 结构、内鏈、Sitemap 這些环节通常會被反复检查,但 CDN 與缓存這一层常常被跳過。蜘蛛請求頁面时,拿到的往往不是源站刚刚生成的 HTML,而是邊缘节点上的一份副本。缓存策略如果和内容更新节奏對不上,就會出現源站已经改完、蜘蛛看到的還是舊版本的情况。

缓存為什么會改變蜘蛛看到的内容

搜尋引擎抓取的是一個 URL 的 HTTP 响應,而這份响應可能来自源站,也可能来自 CDN 节点或反向代理的缓存。這带来三個直接後果:

  • 内容更新後,如果 HTML 缓存未過期,蜘蛛抓到的仍是舊正文、舊标题或舊連結;
  • 狀態碼同样會被缓存,被缓存的 404 或 301 會在缓存周期内持續返回给蜘蛛;
  • 缓存键設定不合理时,不同參數的頁面可能互相覆盖,返回同一份内容。

所以缓存不只是运维话题,它直接决定了蜘蛛實际讀到什么。

發布前值得確認的几項策略

HTML 文档的缓存时長

動態生成的 HTML 一般不建议做長時間缓存。常见做法是给 HTML 設定較短的 s-maxage,或者使用 must-revalidate,让节点在内容更新後能較快回源。把 HTML 缓存一整天,虽然能减轻源站压力,但当天所有改動對蜘蛛来说都是不可见的。

静態资源用長缓存加版本指纹

CSS、JS、图片這類文件可以放心使用長缓存,前提是文件名或查询串带版本号。更新时改文件名,蜘蛛和浏览器自然會拿到新文件,不需要专门去刷新缓存。

狀態碼不要被長期缓存

需要特別检查 404、410、301、302 的缓存头。一個临时下线的頁面如果被缓存成 404,在缓存過期前蜘蛛每次来都會得到同样的结果;被缓存的跳轉也一样,即使你後来改回了正常頁面,节点仍會繼續跳。

缓存键與查询參數

確認缓存键是否包含查询參數。如果忽略參數,分頁、篩選、排序這些带參數的 URL 會共用一份缓存,蜘蛛抓到的内容與 URL 不對應,容易被判定為重复或空壳。反過来,如果參數過度參與缓存键,又會造成大量回源。

robots.txt 與 sitemap.xml

這两個文件通常放在根目錄,也很容易被 CDN 一起缓存。它們的缓存時間建议短一些,避免新規則或新地址迟迟不生效。

内容更新後的刷新動作

  1. 發布完成後,主動刷新首頁、栏目頁、被改動的詳情頁,以及 sitemap.xml;
  2. 涉及 URL 變更的,先確認 301 已生效,再刷新對應地址;
  3. 把「刷新關键 URL」寫進發布流程,而不是等發現問题再补;
  4. 大范围改版时,考虑整站刷新一次,並观察回源量是否會给源站带来压力。

怎么驗證节点返回的是最新内容

  • 用 curl -I 或浏览器開發者工具查看响應头,關注 Age、X-Cache、CF-Cache-Status 這類字段,判断是否命中缓存、缓存了多久;
  • 带上搜尋引擎的 UA 再請求一次,確認没有针對 UA 的差异化缓存;
  • 從不同地区或不同节点請求同一個 URL,對比正文與狀態碼是否一致;
  • 在 CDN 後台看命中率與回源量,異常升高往往意味着缓存键被频繁绕過。
缓存的目标是减少回源,而不是让内容停留在過去。判断标准很简單:發布十分钟後再抓一次,蜘蛛看到的是不是你現在看到的這一版。

几個常见的坑

  • 為了提高命中率,把 HTML 缓存设得很長,更新只能靠手動刷新;
  • 測試环境與生产环境共用一套缓存規則,測試頁被节点缓存後影响线上;
  • 只刷新首頁,忘了列表頁和 sitemap;
  • 對 404 做長缓存,把後来重新上线的頁面挡在门外;
  • 忽略 Vary 头,導致压缩版與未压缩版、移動版與桌面版互相污染。

小结

CDN 與缓存不需要复杂配置,但需要和發布流程绑在一起:HTML 短缓存、静態资源長缓存加指纹、異常狀態碼不長期缓存、關键 URL 發布後主動刷新。把這四件事固定下来,蜘蛛讀到的内容基本就能和源站保持一致。