後端面試:代理改寫回應時,如何正確使用 HTTP 203?
題目與適用場景
你負責一個 API 閘道,代理可能過濾惡意附件、移除隱私欄位或轉碼回應。源站請求成功,但下游收到的表示已不是源站原樣。請說明何時回傳 203、如何更新快取驗證器,以及如何避免用戶端把代理內容誤認為權威源站資料。
HTTP 203 是成功回應,表示轉換代理修改了源站 200 回應的標頭或內容。它適合需要把「成功但經過中介層改寫」傳給用戶端的場景,不是通用錯誤碼。
面試官考察點
- 能否區分 203、200、304、4xx 與 5xx 的語意。
- 能否說明轉換代理如何影響快取、ETag、簽章與後續請求。
- 能否設計原始表示與轉換表示的稽核關聯。
- 能否處理多層代理重複轉換、回源失敗與不理解 203 的用戶端。
- 能否把協定語意落到可測試的標頭與快取行為。
回答前需要釐清的問題
- 改寫是安全過濾、壓縮轉碼還是個人化欄位移除?這會決定是否可共享快取。
- 用戶端能否識別 203?若不能,是否需要相容層與自有中繼資料?
- 原始內容是否需要可追溯?簽章、ETag 與稽核記錄必須連結原始與轉換版本。
- 轉換是否具確定性?規則版本若不同,快取鍵就必須包含規則版本。
30 秒回答框架
我先確認閘道是否真的改變成功回應的內容或標頭。源站成功且代理改寫表示時使用 203;未改寫則保留 200。203 不取代 304,304 只表示用戶端可重用已驗證的快取。轉換後重新計算下游 ETag,快取鍵包含內容協商、規則版本與租戶邊界。稽核同時保存源站版本、轉換規則與輸出摘要;回源失敗則依實際失敗語意回傳。
分步驟深入解答
1. 建立狀態碼邊界
200 表示成功,沒有宣告表示被改寫;203 表示成功但轉換代理修改源站 200 的標頭或內容;304 沒有新表示,只要求重用已驗證快取。過濾失敗、拒絕與回源逾時使用相應的 4xx 或 5xx。
2. 辨識轉換類型
惡意附件替換連結、隱私過濾、格式轉碼與鏡像標記都可能形成 203。只改變傳輸層壓縮或 hop-by-hop 標頭,通常不代表應用表示被改寫。閘道要記錄源站與下游表示的差異。
3. 重新處理驗證器
源站 ETag 描述源站表示;轉換後應產生只對下游表示有效的新 ETag。規則版本若決定輸出,就要進入快取鍵或 ETag 計算,避免規則升級後誤用舊結果。
4. 設計快取與協商
Vary、內容編碼、語言、租戶與過濾規則都可能影響共享性。含個資的結果預設私有快取;公共且確定性的轉換才可共享。收到 If-None-Match 時,閘道應針對自己的轉換表示驗證,不能直接轉傳源站 304。
5. 保護簽章與稽核
源站簽章若涵蓋原始位元組,改寫後不能繼續證明下游內容。閘道要重新簽章或移除失效簽章,並記錄源站請求 ID、源 ETag、規則版本、輸出 ETag 與轉換原因。
6. 處理多層代理
每層代理都要保留前一層轉換關聯,並在轉換不具冪等性時阻止重複處理。若下游不理解 203,可在相容層回傳 200,但必須透過文件化的擴充標頭或中繼資料揭露狀態。
7. 驗證與回滾
測試源站 200、改寫後 203、未改寫 200、快取命中 304、規則升級、回源逾時與過濾器失敗。回滾規則時確認新舊 ETag 不衝突,並清查舊規則產生的共享快取。
高品質示範回答
我會把 203 當作「成功,但轉換代理改變源站表示」的協定聲明。沒有應用層改寫時回傳 200;有改寫時回傳 203;304 只驗證下游既有表示,不能因源站回傳 304 就忽略轉換層。閘道為轉換表示重新產生 ETag,並把規則版本、內容協商與隱私邊界放進快取鍵。源站簽章若涵蓋原始位元組,改寫後必須重簽或移除。測試 200/203/304、規則升級、多層代理與回源失敗,確保用戶端不會把過濾後內容當成源站原文。
常見錯誤
- 所有代理回應都用 203 → 語意失真 → 只在表示確實被改寫時使用。
- 沿用源站 ETag → 驗證器對應錯誤表示 → 重新計算轉換表示的 ETag。
- 把 203 當錯誤碼 → 用戶端可能重試或告警 → 失敗使用真實 4xx/5xx 語意。
- 直接轉傳源站 304 → 轉換層可能未重新驗證 → 針對下游表示驗證。
- 忽略規則版本 → 規則升級後命中舊快取 → 版本納入快取鍵或驗證器。
追問及應對
代理只改變 Content-Encoding,需要 203 嗎?
通常不需要。傳輸編碼屬於傳輸層;應用表示未變時保留 200,並依內容協商處理。
203 可以被共享快取嗎?
可以,但轉換必須確定,快取鍵涵蓋所有變化維度,且內容沒有個資。租戶或使用者相關結果應使用私有快取。
源站回 203,閘道又改寫一次怎麼辦?
保留兩層轉換關聯,重新計算最終 ETag,並確認規則具冪等性;無法保證時只允許一次轉換。
用戶端只接受 200,可以把 203 改成 200 嗎?
可以在明確相容層降級,但要附帶可識別中繼資料並記錄,不可靜默隱藏安全過濾或隱私改寫。
源站回 304,但本地沒有轉換快取物件怎麼辦?
不能直接回 304。閘道需取得可用表示、重新轉換,或回傳反映本地缺少表示的失敗結果。