把入口页挂在 CDN 后面是常见做法,一来能挡掉一部分无效请求,二来响应更快、更稳。但上线之后不少人会发现:自己在源站明明改了链接,搜索蜘蛛的抓取日志里却还是老样子。这多半和“蜘蛛到底抓到了哪一层”有关。
搜索蜘蛛拿到的是边缘节点的响应
从搜索蜘蛛的视角看,它请求的是入口页的域名,DNS 解析到哪个 IP、中间经过几层缓存,它并不关心。只要 CDN 对 HTML 开了缓存,边缘节点上有副本时就会直接返回副本,源站根本不会收到这次请求。
也就是说,蜘蛛看到的内容大体等于边缘节点的缓存副本,而不是你刚改完的源站文件。缓存没到期之前,链接、正文、响应头都以副本为准。
几种容易被忽略的具体影响
1. 链接更新有延迟
你在源站新增或删除了目标链接,蜘蛛拿到的仍是旧副本里的链接集合。抓取量看起来“没反应”,不一定是蜘蛛的问题,而是它压根没看到新链接。
2. 响应头被一起缓存下来
如果源站曾经返回过 X-Robots-Tag、Set-Cookie 之类的头部,部分 CDN 会连同响应头一起缓存。蜘蛛拿到的是一份上下不完全一致的响应,判断依据可能和你当前源站的配置对不上。
3. 状态码也可能是缓存的
源站短暂返回过 5xx 或 404,如果被缓存下来,蜘蛛在缓存有效期内会持续看到这个状态码。反过来,源站已经修好了,蜘蛛那边可能还没“解冻”。
4. 不同节点内容不一致
多节点回源时间不同,可能出现 A 节点是旧版本、B 节点是新版本的情况。蜘蛛这次和下次请求命中不同节点,看到的链接就不一样,表现得很“随机”。
排查顺序可以按这个来
- 先看响应头。用蜘蛛的 UA 请求入口页,重点看 Age、X-Cache、CF-Cache-Status 这类字段,判断这次是命中缓存还是回源。
- 再对比内容。同一 URL 分别带缓存参数和不带参数请求一次,比较正文长度和链接数量是否一致。
- 然后看源站日志。如果源站访问日志里几乎看不到蜘蛛 IP,说明请求基本被边缘节点吃掉了。
- 最后确认刷新策略。是等 TTL 自然过期,还是每次更新都主动刷新,这决定了蜘蛛多快能看到新内容。
几个实操上的建议
- 入口页这类“链接随时会变”的页面,缓存时间不适合设得太长,几分钟到十几分钟级别通常就够用。
- 更新链接后主动刷新对应 URL 的缓存,比干等 TTL 更可控。
- 不要把入口页和图片、样式这类静态资源用同一套缓存规则,两者的更新频率完全不是一个量级。
- 如果入口页需要按 UA 返回不同内容,先确认 CDN 的缓存键里有没有带上 UA,否则很容易互相串味。
CDN 本身不是问题,问题往往出在“被缓存的东西”和“你正在改的东西”不是同一份。把这一层理清楚,很多“蜘蛛不抓新链接”的困惑会自然消解。
最后提醒一句:无论缓存怎么配,蜘蛛是否抓取、何时抓取,仍然由搜索引擎自己决定。我们能做的,是让它每次来看到的内容都准确、可预期。