入口頁挂在 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 發現效率,结论才靠得住。