有些站長在检查服務器日誌时會發現,搜尋蜘蛛訪問入口頁时返回的狀態碼不是 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 並不等于新連結永遠不會被發現,但它确實會把發現的時間往後推。把缓存策略和連結更新的节奏對齐,比反复提交、反复改頁面更有效。不同搜尋引擎對缓存的處理细节並不公開,能稳定控制的只有自己這一侧的輸出。