常见問题

蜘蛛池入口頁经過 CDN 缓存,搜尋蜘蛛抓到舊内容會影响 URL 發現吗

入口頁放在 CDN 後面很常见,但缓存没配好时,搜尋蜘蛛可能拿到几天前的舊副本:舊連結繼續被抓,新加的目标 URL 却看不到。這篇文章讲清楚 CDN 缓存影响 URL 發現的几個环节、怎么用响應头和日誌判断蜘蛛拿到的是不是舊版本,以及缓存策略應该怎么設定。

常见問题

蜘蛛池入口頁经過 CDN 缓存,搜尋蜘蛛抓到舊内容會影响 URL 發現吗

入口頁挂在 CDN 後面是很常见的配置,既能让頁面响應更快,也能扛住突發訪問。但缓存規則一旦配得太粗,搜尋蜘蛛拿到的可能就是一個舊的缓存副本:昨天已经撤掉的連結還在,今天新加的目标 URL 一個都看不到。入口頁的作用本来就是让蜘蛛看到目前這批連結,所以這個問题比普通頁面更敏感。

為什么搜尋蜘蛛容易拿到舊副本

CDN 的缓存键通常由 URL、Host 和部分請求头决定。搜尋蜘蛛的請求和普通浏览器請求有几個明顯区別:不带 Cookie、不携带會话信息、UA 固定。如果缓存規則是按忽略 Cookie、按 URL 整頁缓存来配的,那蜘蛛命中的就是上一次缓存下来的 HTML,和浏览器看到的内容完全無關。

更麻烦的是分层缓存。邊缘节点没有命中时會回到中間层,中間层可能還留着更早的版本。所以同一個入口頁,在 A 节点是新的、在 B 节点是舊的,這種情况並不少见。

舊内容會怎样影响 URL 發現

  • 新連結看不到:源站已经把今天要提交的 URL 寫進 HTML,但蜘蛛拿到的是舊副本,這批連結自然不會被發現。
  • 舊連結被反复抓取:缓存里還留着已经失效或已经被替換掉的目标地址,蜘蛛每次来都顺着抓一遍,白白占用了抓取配額。
  • 日誌和實际情况對不上:你看源站文件是對的,日誌里蜘蛛請求的却一直是舊内容,很容易誤判成蜘蛛不抓新連結。

怎么確認蜘蛛拿到的是缓存還是源站

  1. 用命令行带上搜尋蜘蛛的 UA 請求入口頁 URL,看返回的 HTML 里有没有你最新加的連結。
  2. 看响應头里的缓存标记,例如 AgeX-CacheCF-Cache-Status 這類字段,Age 很大說明命中了舊缓存。
  3. 對比源站直连和经過 CDN 的两份 HTML,最好用文本比對工具,看差异具体在哪几行。
  4. 對照服務器日誌里的蜘蛛請求時間,看看它命中的是不是缓存刷新的空档期。

如果源站直连是對的、走 CDN 是舊的,那基本可以确定問题出在缓存层,不需要再往別處找原因。

缓存策略怎么設定更稳妥

入口頁属于更新频率不固定、但又需要被及时看到的頁面,可以按下面的思路調整:

  • 给入口頁單獨设一條缓存規則,把 TTL 調短,比如几分钟到十几分钟,而不是和图片、样式這類静態资源共用一套長缓存。
  • 源站更新連結後,主動調用刷新接口清掉對應 URL 的缓存,不要等它自然過期。
  • 如果 CDN 支持,開啟缓存校驗或 stale-while-revalidate 這類机制,让蜘蛛在回源的同时也能尽快拿到新内容。
  • 不要在缓存层按 UA 做区分,只给搜尋蜘蛛返回一份没有連結的版本,這種做法容易被判定為隐藏内容。

几個容易踩的坑

缓存問题最容易被誤判成抓取問题。看到蜘蛛来過、却没發現新連結,先別急着換入口頁或者加連結,先確認它看到的是不是最新版本。
  • 只刷新了首頁缓存,没有刷新入口頁路径,等于没刷。
  • 用加版本參數的方式绕開缓存,虽然能拿到新内容,但每次都會产生一個新的 URL,反而增加了重复地址。
  • 入口頁同时挂了 sitemap 提交,缓存舊内容时两邊给的連結列表不一致,會让蜘蛛的判断更混乱。

把 CDN 缓存這一层理顺之後,入口頁的日誌會干净很多:蜘蛛抓到的連結和你在源站维護的列表能對上,再去判断抓取节奏、URL 發現效率,结论才靠得住。