给站点套上 CDN 之后,你本地看到的页面和蜘蛛在某个节点上拿到的页面,可能并不是同一份。缓存命中、回源策略、User-Agent 规则这几处配置稍有不慎,URL 发现和抓取就会一起受影响。
CDN 在抓取路径里扮演什么角色
蜘蛛请求一个 URL 时,最先到达的是离它较近的 CDN 节点。节点如果命中缓存,直接返回副本;没命中才回源站。对蜘蛛来说,它拿到的就是节点给它的那份响应,而不是源站最新生成的 HTML。这意味着节点上的缓存副本、缓存时间,以及节点对蜘蛛的识别方式,都会直接决定它能不能看到页面里的链接。
几种常见的“看不见”
- 缓存了错误页:源站一次 5xx 或 404 被节点缓存下来,后续蜘蛛再来仍收到同样的错误响应,里面的链接自然发现不了。
- 缓存了旧版本:新发布的列表页和文章页已经上线,节点还在给几个月前的 HTML,新 URL 根本不在里面。
- UA 规则拦住了蜘蛛:为了防爬,节点对特定 User-Agent 直接返回验证页或 403,搜索蜘蛛也被算进去了。
- 只缓存了部分变体:带参数、带语言前缀的 URL 被合并成同一个缓存键,返回的却是另一条地址的内容。
缓存头怎么写更稳妥
HTML 与静态资源分开处理
HTML 通常不适合长时间强缓存。可以给页面设置较短的 s-maxage,配合 stale-while-revalidate,让节点在回源更新的同时仍能快速响应。对确实不变的静态资源可以放长缓存,但 HTML 与接口响应要和它们区分开,避免一条规则套全站。
把变体维度声明清楚
如果站点会根据语言、设备或登录状态返回不同内容,记得用 Vary 声明区分维度,避免节点把 A 版本喂给 B 场景,导致蜘蛛在一份不包含目标链接的 HTML 上打转,始终发现不了真正需要抓取的地址。
怎么验证节点返回的就是源站内容
- 用蜘蛛的 User-Agent 请求目标 URL,查看响应头里的缓存命中标识与回源标识。
- 对比节点响应与源站直连响应的 HTML,重点看内链和 Sitemap 里申报的地址是否都在。
- 查看源站回源日志,确认蜘蛛请求确实回源过,而不是全程由节点缓存应答。
- 发布新页面后,主动刷新对应 URL 的缓存,别等缓存自然过期。
把缓存策略纳入日常巡检
缓存问题往往不是一次性爆发,而是在某次发布、某次规则调整后慢慢显现。日常巡检时可以固定看几项:核心列表页与详情页的缓存时长、节点响应状态码分布、蜘蛛 UA 的响应是否正常,以及新上线 URL 在节点上是否可访问。
节点返回的页面,才是蜘蛛眼中的页面。源站改对了,缓存没跟上,等于没改。
说到底,CDN 不该成为蜘蛛和你之间的信息差。把缓存时间、变体区分、UA 规则和刷新机制确认清楚,URL 发现这条链路才算真正通到蜘蛛面前。