给站点套上 CDN 之後,你本地看到的頁面和蜘蛛在某個节点上拿到的頁面,可能並不是同一份。缓存命中、回源策略、User-Agent 規則這几處配置稍有不慎,URL 發現和抓取就會一起受影响。
CDN 在抓取路径里扮演什么角色
蜘蛛請求一個 URL 时,最先到達的是离它較近的 CDN 节点。节点如果命中缓存,直接返回副本;没命中才回源站。對蜘蛛来说,它拿到的就是节点给它的那份响應,而不是源站最新生成的 HTML。這意味着节点上的缓存副本、缓存時間,以及节点對蜘蛛的识別方式,都會直接决定它能不能看到頁面里的連結。
几種常见的“看不见”
- 缓存了错誤頁:源站一次 5xx 或 404 被节点缓存下来,後續蜘蛛再来仍收到同样的错誤响應,里面的連結自然發現不了。
- 缓存了舊版本:新發布的列表頁和文章頁已经上线,节点還在给几個月前的 HTML,新 URL 根本不在里面。
- UA 規則拦住了蜘蛛:為了防爬,节点對特定 User-Agent 直接返回驗證頁或 403,搜尋蜘蛛也被算進去了。
- 只缓存了部分變体:带參數、带語言前缀的 URL 被合並成同一個缓存键,返回的却是另一條地址的内容。
缓存头怎么寫更稳妥
HTML 與静態资源分開處理
HTML 通常不适合長時間强缓存。可以给頁面設定較短的 s-maxage,配合 stale-while-revalidate,让节点在回源更新的同时仍能快速响應。對确實不變的静態资源可以放長缓存,但 HTML 與接口响應要和它們区分開,避免一條規則套全站。
把變体维度声明清楚
如果站点會根據語言、设备或登入狀態返回不同内容,记得用 Vary 声明区分维度,避免节点把 A 版本喂给 B 场景,導致蜘蛛在一份不包含目标連結的 HTML 上打轉,始终發現不了真正需要抓取的地址。
怎么驗證节点返回的就是源站内容
- 用蜘蛛的 User-Agent 請求目标 URL,查看响應头里的缓存命中标识與回源标识。
- 對比节点响應與源站直连响應的 HTML,重点看内鏈和 Sitemap 里申报的地址是否都在。
- 查看源站回源日誌,確認蜘蛛請求确實回源過,而不是全程由节点缓存應答。
- 發布新頁面後,主動刷新對應 URL 的缓存,別等缓存自然過期。
把缓存策略纳入日常巡检
缓存問题往往不是一次性爆發,而是在某次發布、某次規則調整後慢慢顯現。日常巡检时可以固定看几項:核心列表頁與詳情頁的缓存时長、节点响應狀態碼分布、蜘蛛 UA 的响應是否正常,以及新上线 URL 在节点上是否可訪問。
节点返回的頁面,才是蜘蛛眼中的頁面。源站改對了,缓存没跟上,等于没改。
说到底,CDN 不该成為蜘蛛和你之間的信息差。把缓存時間、變体区分、UA 規則和刷新机制確認清楚,URL 發現這條鏈路才算真正通到蜘蛛面前。