给站点接上 CDN 或反向代理缓存之後,訪問速度通常會有明顯改善,但随之而来的是一類不太顯眼的問题:源站内容已经更新,訪客和搜尋蜘蛛看到的却還是舊版本。它不像宕机那样立刻暴露,却會让内容一致性和抓取判断慢慢出現偏差。
缓存层為什么會影响抓取
缓存的作用是减少回源、加快响應。当蜘蛛請求一個頁面时,中間缓存直接返回副本,請求根本没有到達源站。如果這份副本是几天前的,蜘蛛拿到的就是過期内容。訪客同样如此,改過的标题、價格、公告都要等缓存過期才能看到。
更麻烦的是,多次抓取都命中同一份舊副本时,容易让人产生誤判:明明已经處理過的内容,為什么蜘蛛那邊還是老样子。
几類常见的配置疏漏
HTML 頁面缓存時間设得過長
把 HTML 的缓存時間設定成一天甚至一周,對更新频繁的栏目頁、列表頁並不合适。這類頁面每天都有新内容,缓存時間應该短一些,或者改用主動刷新。
缓存键忽略 URL 參數
有些缓存配置只按路径做键,忽略查询參數。這样一来,?page=2 和 ?page=3 可能命中同一份缓存,分頁内容就會串位,蜘蛛抓到的列表和實际不符。
動態接口被当作静態资源缓存
接口返回的 JSON、带登入態的頁面、购物车頁面如果被公共缓存,不僅會串用戶資料,也會让蜘蛛抓到並不属于公開范围的内容。
CDN 與源站内容不一致
源站改了内容,CDN 未刷新;或者多台缓存节点之間刷新時間不同步,同一個 URL 在不同节点返回不同版本。蜘蛛分布在不同地区时,看到的頁面可能並不一致。
一份可执行的自查清單
- 列出需要缓存的资源類型,区分静態资源、HTML 頁面、動態接口,分別设定策略。
- 检查 HTML 缓存時間,確認更新频繁的栏目頁没有被设成過長的 TTL。
- 確認分頁、篩選、排序參數是否進入了缓存键,避免不同參數共用同一份缓存。
- 核對带登入態的接口是否被公共缓存,必要时补上不缓存的响應头。
- 抽查几個刚更新過的地址,對比源站與 CDN 返回的内容是否一致。
- 確認刷新机制:改完内容後是能主動刷新,還是只能等過期。
- 在不同地区、不同节点各抽查一次,確認返回版本统一。
- 把缓存命中率和回源情况纳入日常监控,出現異常能及时看到。
缓存更新和蜘蛛訪問怎么配合
内容更新後,比較稳妥的做法是先刷新缓存,再让頁面進入正常的抓取流程。如果站点有自己的推送或提交机制,可以按先刷新、再通知的顺序操作,避免蜘蛛先抓到舊副本。
對于更新频繁的列表頁,可以把缓存時間设短一些;图片、字体、样式表等静態资源則可以设長一些,靠文件名带版本号来控制更新。這样既保住了速度,又不會让正文長期滞後。
缓存不是设一次就一劳永逸的配置,它更像一個需要跟着内容节奏調整的開關。
把缓存纳入日常巡检
可以固定每周抽几個更新過的頁面,比對源站與缓存返回的内容,顺便看看日誌里是否出現同一地址反复回源或長期不回源的情况。發現不一致就及时刷新,並回头检查規則本身。
缓存問题的特点是安静:站点不报错,頁面也能打開,只是内容慢了一拍。定期自查,比等到訪客反馈再處理要省事得多。