Playwright 回應標頭拆分開放報告:代理瀏覽器測試應驗證 HTTP 日期

Microsoft Playwright 儲存庫在 2026 年 9 月 12 日出現一條開放 Issue。報告指出,Firefox 與 WebKit 的 response.headersArray() 可能在逗號處拆分原本只有一個值的回應標頭。HTTP 日期本來就包含逗號,因此 Date、Last-Modified 可能顯示成兩個項目,即使伺服器只傳送一行。報告也描述 macOS WebKit 處理含 Expires 日期之 Set-Cookie 的差異。
這仍是使用者提交的開放報告,不是維護者確認的缺陷或已發布修正。重現環境使用 Playwright 1.64.0-next、macOS arm64,並比較 Chromium、Firefox 和 WebKit。變更生產邏輯前必須在自己的版本重現。
內部研究來源:Microsoft Playwright 儲存庫,Issue 42687,《headersArray() splits single header values on commas on Firefox and WebKit, corrupting every HTTP-date header》,2026 年 9 月 12 日建立。
為何代理蒐集需要關注
瀏覽器自動化常用回應標頭判斷新鮮度、快取、簽章證據及工作階段。若一個標頭被拆成兩值,蒐集器可能解析無效日期、把新內容標成過期、重複記錄事件,或遺失 Cookie 到期屬性。
代理也可能轉送、正規化或附加標頭。沒有直連與來源端原始證據時,容易把客戶端轉換誤判為代理問題,或漏掉真正路由變化。
建立自有標頭夾具
在自有 HTTPS 端點傳回確定的 Date、Last-Modified、Expires、日期形式 Retry-After,再加入允許逗號清單的欄位,以及兩條獨立 Set-Cookie,其中一條包含 Expires。
正文加入隨機挑戰與請求編號,並於來源端保存預期原始標頭對,便於和瀏覽器輸出比較。
執行跨瀏覽器路由矩陣
| 維度 | 值 |
|---|---|
| 瀏覽器 | Chromium、Firefox、WebKit |
| 路徑 | 直連、代理閘道 A、代理閘道 B |
| API | headersArray、headerValue、allHeaders、來源端原始日誌 |
| 位址族 | 已購買的 IPv4、IPv6 |
| 工作階段 | 新建、固定、輪換 |
固定瀏覽器版本、Playwright 版本、目標、語系、時區及請求標頭。每格重複測試,不以單一瀏覽器輸出作唯一事實。
解析日期前先比較結構
記錄每個欄位的項目數、順序、不分大小寫名稱、完整值摘要及解析結果。單值 HTTP 日期必須保持一個語意值。不能把所有陣列項目一律用逗號接回,因為清單型及重複型標頭有不同規則。
- 單值日期要保留完整日期;
- 清單型欄位可含逗號分隔成員;
Set-Cookie必須保留獨立 Cookie 行及Expires內逗號;- 未知欄位不可在沒有明確語法時猜測重建。
區分代理與客戶端轉換
依序比較來源端原始標頭與直連 Chromium、來源端與直連 Firefox/WebKit、同一瀏覽器直連與代理,以及獲准閘道擷取與瀏覽器輸出。
若直連 Firefox/WebKit 已與來源端不同,而線路回應未變,客戶端路徑是主要假設;若只有一個代理路由改變原始證據,再調查該路由。結論必須可重現。
保護快取與新鮮度判斷
不要保存由畸形標頭解析的時間。先確認完整 HTTP 日期可解析、在合理範圍並符合原始值摘要。來源端接收時間要另存,不可冒充伺服器 Date。
若 Last-Modified 驅動條件請求,要確認下一次 If-Modified-Since 傳送完整值。只有星期或遺失逗號會使快取驗證失效。
保護 Cookie 與工作階段
Cookie 到期風險更高,損壞的 Expires 會改變工作階段壽命。比較瀏覽器 Cookie 儲存與原始 Set-Cookie,但不可記錄 Cookie 值;只保存名稱雜湊、到期、網域、路徑、安全旗標及解析結果。
結合TLS 信任設定檔隔離測試和住宅代理工作階段固定性測試。標頭正確不代表出口間工作階段隔離。
正式修正前的臨時處理
關鍵中繼資料優先使用在目前執行環境已驗證能保留完整值的 API,並保留原始標頭或來源端對照。只對已知單值日期做窄範圍處理。按瀏覽器與版本建立回歸測試,正式版本通過後再移除相容程式碼。
不要接合任意標頭陣列、改寫第三方 Cookie 或降低驗證。看似合理但錯誤的中繼資料比拒絕不確定記錄更危險。
上線檢查清單
- 明確標示報告仍開放且未確認;
- 自有夾具有來源端原始標頭對;
- 三瀏覽器皆完成直連及代理對照;
- 單值日期保持一個語意值;
- 清單欄位與 Set-Cookie 分開處理;
- 快取驗證器傳送完整日期;
- 日誌不含 Cookie 值;
- 未知或畸形資料預設拒絕;
- 每次測試保存瀏覽器版本;
- 臨時方案有明確移除測試。
常見問題
這能證明代理修改標頭嗎?
不能。報告涉及 Playwright 表示路徑,必須比較直連、來源端原始證據和代理路徑後再歸因。
可以把所有重複值用逗號接合嗎?
不可以。不同欄位組合規則不同,Set-Cookie 需要特殊處理。只依明確語法重建。
回應正文會受影響嗎?
報告聚焦標頭表示,正文另用代理回應完整性測試驗證。
現在就該修改生產解析嗎?
只有在精確版本重現後才修改,並使用窄範圍、可回復且有回歸測試的方案。
合規說明
只測試自有或獲准系統與代理路由。最小化標頭留存,不洩露 Cookie 或憑據,遵守隱私、合約及平台要求。中繼資料驗證不得用於繞過存取控制。