常见问题

入口页做了 CDN 缓存,搜索蜘蛛拿到旧版页面时,目标 URL 还能被发现吗?

入口页接入 CDN 或反向代理后,蜘蛛拿到的往往是缓存版本。缓存本身不阻断 URL 发现,真正决定成败的是缓存那份 HTML 里还有没有可解析的链接,以及缓存层有没有拦爬虫、返回的是不是简化版页面。本文梳理几种常见情况、自查方法和运营处理建议。

常见问题

入口页做了 CDN 缓存,搜索蜘蛛拿到旧版页面时,目标 URL 还能被发现吗?

先给结论:缓存决定“看到哪一版”,不决定“能不能发现”

入口页的 HTML 被 CDN 或反向代理缓存,本身并不会让搜索蜘蛛失去发现目标 URL 的能力。蜘蛛请求入口页时拿到的就是缓存节点返回的那份 HTML,它只会解析这份 HTML 里的 a 标签和可识别链接。所以真正的问题不是“页面被缓存了”,而是“被缓存的那一版里有没有链接”。

换句话说,缓存影响的是一条时间线:你什么时候往入口页加了新目标 URL,蜘蛛什么时候才能从缓存节点上看到它。

三种常见情况

  • 缓存版本里有链接:这是最常见的情况。入口页更新完成、缓存刷新后,蜘蛛拿到的缓存 HTML 里包含目标链接,URL 发现流程照常走。
  • 缓存还是旧快照:你刚加了一批目标链接,但 CDN 上仍是最早那一版 HTML,蜘蛛自然看不到新增链接,表现就是“加了但一直没动静”,通常等缓存过期或手动刷新后就恢复正常。
  • 缓存层直接拦住了请求:CDN 开了爬虫 UA 黑名单、人机验证或频繁访问限制,蜘蛛拿到的可能是 403、验证页或一个没有链接的简化页面。这种情况下,蜘蛛根本没有机会解析到目标 URL。

容易被忽略的几个缓存相关设置

  • CDN 规则里对“无 UA、无 Cookie”的请求返回精简版页面,而蜘蛛请求恰好命中这条规则。
  • 按地域或按 UA 差异化返回 HTML,蜘蛛 UA 命中的那一版里没有放链接。
  • HTML 缓存 TTL 设得过长,例如一周以上,入口页更新后要等很久才会回源。
  • 用了“仅缓存、不回源”的边缘逻辑,源站入口页改了,边缘节点长期不更新。
  • CDN 与源站之间的压缩、编码差异一般不影响解析,不必为此过度担心。

怎么自查

  1. 用命令行请求入口页,并指定蜘蛛 UA,看返回的 HTML 里到底有没有目标链接。
  2. 加一个随机查询参数再请求一次,绕过缓存直连源站,对比两份 HTML 的链接部分是否一致。
  3. 看响应头里的缓存命中标识,确认这次请求命中的是边缘缓存还是回源结果。
  4. 对照 CDN 访问日志和源站日志,看蜘蛛 UA 的请求有没有回源、回源后源站返回了什么状态码。
  5. 如果日志里只有 CDN 节点 IP、看不到蜘蛛 UA,说明请求在边缘就被处理掉了,需要检查 CDN 的 UA 转发设置。

运营上的处理建议

  • 入口页这类需要经常更新的页面,缓存 TTL 不要设太长,几小时到一天之间比较灵活。
  • 更新入口页链接后,顺手做一次缓存刷新,让新版本尽快对蜘蛛可见。
  • 不要给入口页开启爬虫拦截、人机验证或访问频率封锁,这些功能对正常抓取的伤害远大于防护收益。
  • 如果确实做了 UA 差异化,务必保证蜘蛛 UA 走的是包含完整链接的版本。
  • 入口页不必追求极致缓存命中率,稳定、可解析比“快”更重要。
提示:刷新缓存只是让新版本更快被看到,能不能被抓取还要看抓取预算、目标 URL 自身质量和站点整体情况,不要把刷新缓存当成提升抓取的手段。

小结

CDN 缓存不是搜索蜘蛛发现目标 URL 的障碍,障碍是缓存版本里没有链接、或者缓存层把蜘蛛挡在门外。排查顺序建议是:先确认蜘蛛能否正常拿到入口页 HTML,再确认拿到的那份 HTML 里有链接,最后才去考虑抓取和被收录的问题。把这三步分开看,很多“加了链接没反应”的情况就能定位清楚。