有些站长在检查服务器日志时会发现,搜索蜘蛛访问入口页时返回的状态码不是 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 或接口动态获取。
怎么确认蜘蛛有没有看到新链接
- 看日志里同一个 URL 的响应码分布,是不是长期只有 304、没有 200;
- 对比源站输出的 HTML 与缓存命中时实际返回的内容;
- 观察新链接第一次被访问的时间,是否明显晚于它上线的时间;
- 临时换一个全新 URL 做入口页,避开缓存干扰,看发现速度是否变化。
蜘蛛池场景下要特别注意
批量生成入口页时,如果用的是同一套模板、同一批资源,很容易出现不同 URL 的 ETag 或 Last-Modified 完全一致的情况。链接改了但标识没改,蜘蛛拿到的仍然是旧缓存,新目标 URL 自然迟迟不出现。把链接内容纳入缓存标识的计算范围,是比反复提交更可靠的做法。
可以做的几件事
第一,确保链接真正变化时,Last-Modified 和 ETag 也跟着变,不要让缓存层把蜘蛛「骗」过去。第二,入口页尽量保持轻量和结构稳定,重要链接直接写在 HTML 里,而不是等脚本渲染。第三,把 sitemap、主动提交和入口页链接配合使用,多一条路就多一次被发现的机会。第四,不要为了绕开缓存去频繁改动无关内容,那只会制造噪音,也让后续排查更困难。
304 本身不是错误,它只是告诉蜘蛛「内容没变」。真正要留意的是:当内容确实变了,缓存标识有没有跟着更新。
总的来说,入口页返回 304 并不等于新链接永远不会被发现,但它确实会把发现的时间往后推。把缓存策略和链接更新的节奏对齐,比反复提交、反复改页面更有效。不同搜索引擎对缓存的处理细节并不公开,能稳定控制的只有自己这一侧的输出。