常见問题

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