常见问题

入口页返回 304,搜索蜘蛛还会重新解析里面的链接吗?

服务器日志里入口页经常返回 304,很多人担心蜘蛛没重新下载页面就看不到新链接。本文解释 304 的触发原理、它对 URL 发现的实际影响,以及缓存标识该怎样和链接更新保持同步。

常见问题

入口页返回 304,搜索蜘蛛还会重新解析里面的链接吗?

有些站长在检查服务器日志时会发现,搜索蜘蛛访问入口页时返回的状态码不是 200,而是 304。于是很自然地产生一个担心:页面没有被重新下载,那么新加上去的链接,蜘蛛还能发现吗?要回答这个问题,先得弄清楚 304 是怎么来的。

304 到底意味着什么

304 Not Modified 属于条件请求的响应。蜘蛛再次访问同一个 URL 时,会带上 If-Modified-Since 或 If-None-Match 请求头,把上次拿到的 Last-Modified、ETag 一起发过来。服务器比对之后,如果认为内容没变,就直接回一个 304,不再传输响应体。

这样做省带宽、省时间,本身是好事。关键在于:返回 304 时,蜘蛛拿不到新的 HTML,只能沿用本地缓存里的那一份。缓存里有什么链接,它这次就只认得什么链接。

为什么它会影响 URL 发现

URL 发现依赖的是页面里的链接结构。如果入口页只更新了正文、顺手加了几条新链接,但服务器判断内容未变而返回 304,蜘蛛这次访问等于白跑一趟,新链接要等到缓存真正失效、返回 200 的那次抓取,才有机会被看到。

不过也不必过度紧张。搜索引擎的缓存有自己的生命周期,长时间不更新之后通常还是会重新拉取完整内容。这个周期多久发生一次,各家策略不同,外部无法准确预判,也没法保证某个时间点一定会刷新。

哪些配置容易触发 304

  • 页面由静态生成或放在 CDN 上,Last-Modified 长时间不动;
  • 用了比较激进的缓存策略,ETag 由模板版本决定而不是由内容决定;
  • 反向代理或对象存储自动补 ETag,源站更新后标识没有同步;
  • 入口页本身是个固定模板,链接靠 JavaScript 或接口动态获取。

怎么确认蜘蛛有没有看到新链接

  1. 看日志里同一个 URL 的响应码分布,是不是长期只有 304、没有 200;
  2. 对比源站输出的 HTML 与缓存命中时实际返回的内容;
  3. 观察新链接第一次被访问的时间,是否明显晚于它上线的时间;
  4. 临时换一个全新 URL 做入口页,避开缓存干扰,看发现速度是否变化。

蜘蛛池场景下要特别注意

批量生成入口页时,如果用的是同一套模板、同一批资源,很容易出现不同 URL 的 ETag 或 Last-Modified 完全一致的情况。链接改了但标识没改,蜘蛛拿到的仍然是旧缓存,新目标 URL 自然迟迟不出现。把链接内容纳入缓存标识的计算范围,是比反复提交更可靠的做法。

可以做的几件事

第一,确保链接真正变化时,Last-Modified 和 ETag 也跟着变,不要让缓存层把蜘蛛「骗」过去。第二,入口页尽量保持轻量和结构稳定,重要链接直接写在 HTML 里,而不是等脚本渲染。第三,把 sitemap、主动提交和入口页链接配合使用,多一条路就多一次被发现的机会。第四,不要为了绕开缓存去频繁改动无关内容,那只会制造噪音,也让后续排查更困难。

304 本身不是错误,它只是告诉蜘蛛「内容没变」。真正要留意的是:当内容确实变了,缓存标识有没有跟着更新。

总的来说,入口页返回 304 并不等于新链接永远不会被发现,但它确实会把发现的时间往后推。把缓存策略和链接更新的节奏对齐,比反复提交、反复改页面更有效。不同搜索引擎对缓存的处理细节并不公开,能稳定控制的只有自己这一侧的输出。