如何識別代理資料收集中的陳舊快取回應

代理請求可以快速完成並回傳 200,但其資訊仍可能過舊,無法用於價格檢查、庫存監控、市場研究快照或在地化稽核。輪換出口 IP 也不保證取得新表示:瀏覽器快取、共享中介層、CDN、Service Worker、應用程式快取與來源伺服器本身都可能重用資料。

新鮮與褪色的資料塊通過全球網際網路代理中繼,並在驗證稜鏡處分流

正確問題不是「是否使用快取」。快取通常正常且合理。真正問題是:「回應是否符合本任務的新鮮度契約,以及能否證明由哪一層提供?」

公開來源說明:RFC Editor,RFC 9111《HTTP Caching》,2022 年 6 月。

用業務語言定義新鮮度

請求前先寫明最大可接受年齡:

工作流程新鮮度契約範例
市場研究目錄必須在排定的收集時段內觀察
價格或庫存檢查表示年齡不得超過核准門檻
廣告或在地化 QA素材與到達狀態適用於活動時段
合規歸檔保存指定 UTC 時間實際觀察到的表示
靜態參考資料即使位元組未變,也需驗證器確認仍有效

不要設定單一全域門檻。季度目錄的「新鮮」不適用於短期促銷。將契約與結果一同保存,方便日後解釋通過原因。

理解各回應標頭能證明什麼

記錄回應標頭,但不要把任何單一欄位視為絕對事實:

  • Date 表示來源伺服器聲明的訊息產生時間。
  • Age 在重用快取回應時回報其在快取中的估計時間。
  • Cache-Control 描述快取與再驗證指示。
  • Expires 可以定義到期時間。
  • ETagLast-Modified 是條件式請求可用的驗證器。
  • Vary 指出哪些請求欄位參與快取選擇。
  • Warning 或中介層專用診斷欄位可補充脈絡,但可攜式邏輯不應依賴未公開的供應商欄位。

時鐘偏差會扭曲時間比較。時間戳記使用同步 UTC,請求耗時使用單調時鐘,詳見代理時鐘偏差指南

缺少 Age 不證明回應直達來源伺服器;存在 Age 也不代表本文不可接受。所有證據都必須與任務契約比較。

建立受控樣本

使用可自行更新的已授權端點,在本文中回傳無敏感資訊的版本標記,並支援 ETagLast-ModifiedCache-ControlDate 與條件式請求。

至少執行以下階段:

  1. 發布版本 A,透過直連對照與每條代理路線取得。
  2. 在聲明的新鮮期內重複請求,確認合理重用。
  3. A 仍在新鮮期時發布版本 B,記錄業務契約是否允許繼續使用 A。
  4. 等待進入必須驗證的階段後再請求。
  5. 使用版本 A 的驗證器傳送條件式請求。
  6. 模擬已授權的來源伺服器故障,觀察是否明確允許提供陳舊回應。
  7. 恢復來源伺服器並確認路線最終收斂到版本 B。

不要使用隨機正式環境頁面作為樣本。內容若不可預測變化,就無法區分快取行為與來源差異。

保存結果信封

每次嘗試記錄:

test_case_id
observed_at_utc
route_id
exit_region
session_id_hash
request_header_profile
final_status
redirect_chain_digest
date_header
age_seconds
cache_control
expires
etag_hash
last_modified
vary
content_type
body_byte_count
body_digest
semantic_version_marker
duration_ms
freshness_contract_seconds
freshness_result

驗證器可能包含內部識別時應保存摘要。不得記錄代理憑證、授權標頭、Cookie、權杖、個人資料或完整敏感本文。

使用請求標頭完整性測試證明對照與代理請求採用相同相關欄位。若 Accept-Language、編碼偏好、Cookie 或授權資訊不同,本文差異可能是正確變體而非陳舊資料。

重試前先分類

使用明確狀態:

  • 新鮮且等價: 符合契約,版本或驗證器符合預期,業務語意正確。
  • 新鮮但屬於變體: 符合契約,但因 Vary、區域、帳號或實驗維度而不同。
  • 陳舊但允許: 超過一般新鮮期,但回應政策明確允許且任務可以接受。
  • 陳舊且不可接受: 超出業務契約,或必須驗證後仍持續回傳舊內容。
  • 來源已更新、快取未收斂: 受控來源為 B,某條路線在政策外仍回傳 A。
  • 無法判定: 缺少時鐘、回應標頭、本文或對照證據。
  • 內容無效: 攔截頁、登入外殼、殘缺本文或錯誤結構;新鮮度無法補救。

不要把所有摘要差異標示為「新鮮」。不同的錯誤頁不是有效新表示。傳輸成功後仍需檢查必要欄位、語言、記錄數與版本標記。

再驗證時保留首次證據

先執行原始請求並保存結果。隨後在來源契約允許時,使用已記錄驗證器發起受控再驗證。304 Not Modified 可以確認已儲存表示仍有效,但不會提供新本文。

測試需要強制驗證時可使用 Cache-Control: no-cache,不要將其與 no-store 混淆,也不要預設加入隨機查詢參數。快取破壞參數可能改變應用程式資源、伺服器行為、分析或簽章要求,而且測試的是另一個快取鍵。

若必須測試唯一 URL,只能使用自有或已授權受控端點,並將其標記為獨立實驗。不得對第三方網站執行無界限的快取破壞。

每次只改變一個維度

矩陣至少包括:

  • 直連對照與代理路線;
  • 各目標區域;
  • 新連線與重用連線;
  • 乾淨與有記錄的瀏覽器設定檔;
  • 一般取得與條件式驗證;
  • 完全相同的 URL、方法、相關請求標頭與帳號狀態;
  • 來源伺服器健康及已核准故障模擬。

同時改變出口 IP、Cookie、語言、瀏覽器版本、請求標頭與 URL 會破壞歸因。代理連線池年齡測試可協助分離連線重用與回應重用。

常見故障模式

舊本文相同,Age 持續增加

在回應或業務新鮮期到期前可能完全合理。超出政策後,保存快取指示、驗證器行為、路線與本文摘要再升級處理。

舊本文相同,但沒有 Age

檢查瀏覽器快取、Service Worker、應用程式回應與來源伺服器。沒有 Age 不等於直達來源。

輪換 IP 後本文不同

確認語言、帳號狀態、實驗分組與 Vary 輸入。新本文可能只是區域變體,而不是更新的表示。

回傳 304,但業務資料仍顯得陳舊

驗證器可能正確確認表示未改變,而來源應用程式本身的資料已經陳舊。快取驗證證明的是相對於驗證器的表示狀態,不是業務事實。

把快速回應當作快取命中

延遲不是可靠的快取證據。附近來源可以很快,壅塞快取也可能很慢。應使用回應標頭、驗證器、受控版本變化與本文摘要。

操作檢查清單

  • 為每項任務定義新鮮度門檻。
  • 記錄精確 URL、方法、請求標頭、路線、區域與用戶端組建。
  • 保存 DateAgeCache-ControlExpires、驗證器與 Vary
  • 對本文計算摘要並驗證業務語意。
  • 與受控直連路線比較。
  • 在再驗證或重試前保存首次結果。
  • 每次只改變一個維度。
  • 區分合理變體與陳舊內容。
  • 避免無界限查詢參數快取破壞。
  • 將憑證、識別符、Cookie 與敏感本文去識別化。
  • 針對契約失敗告警,而不是針對使用快取告警。

常見問題

輪換住宅代理是否保證內容最新?

不保證。輪換改變網路出口,但瀏覽器、中介層、CDN、Service Worker、應用程式或來源快取仍可能重用表示,也可能只產生不同區域變體。

Age: 0 能否證明來源產生了新本文?

不能。它只是一項快取訊號。還需結合驗證器、受控版本標記、本文摘要與直連比較。

每個收集請求都應使用 no-cache 嗎?

不應。這會增加來源負載並失去合理效能收益。只在業務需要驗證且目標允許時使用,並與已記錄的新鮮度契約一致。

陳舊回應是否可能被接受?

可以,前提是 HTTP 政策允許且業務契約接受,例如已核准來源故障期間的非關鍵參考資料。必須明確標記,不能簡單稱為新鮮。

合規說明

只測試你獲准使用的端點、帳號、資料集與代理基礎設施。遵守快取指示、存取控制、合約、隱私、著作權、適用的 robots 規則與速率限制。控制樣本流量,不得利用快取測試繞過限制或迫使來源伺服器承受過量負載。