入口页挂在 CDN 后面是很常见的配置,既能让页面响应更快,也能扛住突发访问。但缓存规则一旦配得太粗,搜索蜘蛛拿到的可能就是一个旧的缓存副本:昨天已经撤掉的链接还在,今天新加的目标 URL 一个都看不到。入口页的作用本来就是让蜘蛛看到当前这批链接,所以这个问题比普通页面更敏感。
为什么搜索蜘蛛容易拿到旧副本
CDN 的缓存键通常由 URL、Host 和部分请求头决定。搜索蜘蛛的请求和普通浏览器请求有几个明显区别:不带 Cookie、不携带会话信息、UA 固定。如果缓存规则是按忽略 Cookie、按 URL 整页缓存来配的,那蜘蛛命中的就是上一次缓存下来的 HTML,和浏览器看到的内容完全无关。
更麻烦的是分层缓存。边缘节点没有命中时会回到中间层,中间层可能还留着更早的版本。所以同一个入口页,在 A 节点是新的、在 B 节点是旧的,这种情况并不少见。
旧内容会怎样影响 URL 发现
- 新链接看不到:源站已经把今天要提交的 URL 写进 HTML,但蜘蛛拿到的是旧副本,这批链接自然不会被发现。
- 旧链接被反复抓取:缓存里还留着已经失效或已经被替换掉的目标地址,蜘蛛每次来都顺着抓一遍,白白占用了抓取配额。
- 日志和实际情况对不上:你看源站文件是对的,日志里蜘蛛请求的却一直是旧内容,很容易误判成蜘蛛不抓新链接。
怎么确认蜘蛛拿到的是缓存还是源站
- 用命令行带上搜索蜘蛛的 UA 请求入口页 URL,看返回的 HTML 里有没有你最新加的链接。
- 看响应头里的缓存标记,例如 Age、X-Cache、CF-Cache-Status 这类字段,Age 很大说明命中了旧缓存。
- 对比源站直连和经过 CDN 的两份 HTML,最好用文本比对工具,看差异具体在哪几行。
- 对照服务器日志里的蜘蛛请求时间,看看它命中的是不是缓存刷新的空档期。
如果源站直连是对的、走 CDN 是旧的,那基本可以确定问题出在缓存层,不需要再往别处找原因。
缓存策略怎么设置更稳妥
入口页属于更新频率不固定、但又需要被及时看到的页面,可以按下面的思路调整:
- 给入口页单独设一条缓存规则,把 TTL 调短,比如几分钟到十几分钟,而不是和图片、样式这类静态资源共用一套长缓存。
- 源站更新链接后,主动调用刷新接口清掉对应 URL 的缓存,不要等它自然过期。
- 如果 CDN 支持,开启缓存校验或 stale-while-revalidate 这类机制,让蜘蛛在回源的同时也能尽快拿到新内容。
- 不要在缓存层按 UA 做区分,只给搜索蜘蛛返回一份没有链接的版本,这种做法容易被判定为隐藏内容。
几个容易踩的坑
缓存问题最容易被误判成抓取问题。看到蜘蛛来过、却没发现新链接,先别急着换入口页或者加链接,先确认它看到的是不是最新版本。
- 只刷新了首页缓存,没有刷新入口页路径,等于没刷。
- 用加版本参数的方式绕开缓存,虽然能拿到新内容,但每次都会产生一个新的 URL,反而增加了重复地址。
- 入口页同时挂了 sitemap 提交,缓存旧内容时两边给的链接列表不一致,会让蜘蛛的判断更混乱。
把 CDN 缓存这一层理顺之后,入口页的日志会干净很多:蜘蛛抓到的链接和你在源站维护的列表能对上,再去判断抓取节奏、URL 发现效率,结论才靠得住。