蜘蛛池知识

蜘蛛池入口页接入 CDN 之后:缓存策略、回源与蜘蛛拿到的版本

蜘蛛池入口页接入 CDN 后,蜘蛛拿到的未必是源站当前版本。文章从缓存时长、缓存键、Vary 头三个参数讲起,说明多节点内容不一致、回源日志缺口、WAF 误拦等常见问题,并给出节点对比测试、主动刷新缓存、搜索引擎 IP 加白等可操作检查项,也说明什么规模的站点不必急着上 CDN。

蜘蛛池知识

蜘蛛池入口页接入 CDN 之后:缓存策略、回源与蜘蛛拿到的版本

CDN 解决的是访问速度,不是 URL 发现

蜘蛛池入口页的数量上去之后,很多人会顺手给入口页套一层 CDN:一是分摊源站压力,二是让不同地区的蜘蛛访问都快一点。这个思路本身没问题,但 CDN 会在源站和蜘蛛之间加一层缓存,蜘蛛拿到的可能不是源站当下的版本。如果不注意,排查抓取问题时会一直盯着源站,而问题其实出在缓存上。

缓存的三个参数决定蜘蛛看到什么

缓存时长

Cache-Control 的 max-age 直接决定蜘蛛多久能看到新内容。入口页内容更新不频繁的话,可以设得长一些,减少回源;但如果入口页上的链接列表经常调整,缓存时间过长会让蜘蛛一直爬到旧列表,新加的 URL 迟迟发现不了。常见做法是给入口页设置中等长度的缓存,同时保留主动刷新的手段。

缓存键里包含哪些参数

有些 CDN 默认忽略 URL 上的查询参数,或者只保留白名单里的参数。入口页如果靠参数区分不同列表,比如分页参数、分类参数,这些页面在缓存层可能被合并成同一份内容。蜘蛛抓到的第二页其实是第一页,翻页等于没翻。上线前确认缓存键是否覆盖了影响内容的参数,是必要的。

Vary 头

Vary: User-Agent 会让 CDN 按 UA 分别缓存。如果源站对不同 UA 返回的内容不一致,蜘蛛很可能被分到一份不完整的缓存上。不少站点为了让移动端体验更好,对移动 UA 返回不同模板,结果蜘蛛拿到的版本里链接少了很多。要么保证不同版本的核心链接一致,要么干脆不给蜘蛛做差异化。

多节点带来的不一致

CDN 节点是各自回源的,不同节点回源的时刻不同,缓存里的内容也会有先后。蜘蛛在短时间内访问多个入口页,可能从不同节点拿到新旧混杂的版本。内容差异太大时,容易让蜘蛛判定页面不稳定。缓解方式是把入口页的核心结构做成静态的、变化少的部分,把频繁变动的部分缩小,或者用主动刷新让各节点尽快对齐。

回源日志:确认蜘蛛有没有真的打到源站

接了 CDN 之后,源站日志里能看到的蜘蛛请求会变少,因为大部分请求被缓存拦截了。这时候判断蜘蛛行为,不能只看源站日志,还要看 CDN 侧的访问日志。两边对照才能知道:蜘蛛来过几次、命中缓存的比例有多高、有没有因为节点问题返回异常状态码。

如果源站日志里几乎看不到搜索引擎蜘蛛,但 CDN 日志里有,说明缓存生效正常;反过来,如果两边都没有,才需要去查 DNS、robots、封禁策略这些更前面的环节。

安全策略可能顺手把蜘蛛拦了

很多 CDN 自带 WAF 和 Bot 管理。默认策略下,频率较高的抓取容易被判定为异常流量,返回 403、429,或者弹一个 JS 验证。这类拦截对正常用户的体验影响不大,但对蜘蛛来说等于入口被切断。可以做的事情是把已知的搜索引擎 IP 段加白,或者对静态的入口页路径放宽频率限制。

一些可操作的检查项

  • 用多个地区的节点分别访问同一个入口页,比较返回内容是否一致。
  • 确认缓存键是否包含分页、分类等影响内容的参数。
  • 入口页列表更新后,主动刷新缓存,不要只等 TTL 到期。
  • 把搜索引擎 IP 段从 WAF 的频率规则里排除。
  • 同时保留源站日志和 CDN 日志,便于对照排查。

什么时候不必急着上 CDN

入口页数量不多、源站本身带宽充足、访问量也不大的时候,直接走源站反而更省事:缓存带来的不确定因素没有了,排查问题时链路也短。CDN 的价值在规模和地域分布上体现得比较明显,如果只是几十个入口页,可以先不急着加这一层。

CDN 本身不会帮助页面被发现,它只是改变了蜘蛛访问时经过的路径。把缓存策略、回源行为和日志对照做扎实,才能保证蜘蛛看到的是你希望它看到的那一版。