具代表性的面試主題

後端面試:HTTP 506 Variant Also Negotiates 如何定位?

後端中等
Offer.cc 編輯團隊發佈 更新

題幹

請求支援透明內容協商的資源時返回 506。請說明觸發條件、如何區分 506 與 406/502、客戶端是否重試,以及如何修復伺服器設定。

題幹與適用場景

客戶端請求啟用透明內容協商的資源,伺服器返回 HTTP 506 Variant Also Negotiates。系統含 Apache 風格協商、反向代理和快取。請說明 506 語義、觸發循環、診斷路徑、快取和回退。

面試官考察點

  • 是否知道 506 源自 RFC 2295 透明內容協商。
  • 能否區分協商循環、406 Not Acceptable 與代理 502。
  • 是否會檢查 Alternates、Variant-Vary、TCN 等元資料。
  • 是否能定義客戶端重試、快取與降級邊界。
  • 是否考慮循環檢測、觀測和設定發布門禁。

回答前需要釐清的問題

確認 Accept/Accept-Language、資源是否為 variant list、哪一層產生 506、是否經過代理快取,以及客戶端能否接受固定 representation。假設代理把 variant 選擇再次指向同一協商資源。

30 秒回答框架

506 表示透明內容協商在選擇 variant 時形成循環,伺服器無法得到最終 representation。先從回應鏈和協商元資料確認循環,不把它當作普通上游錯誤。客戶端可請求固定資源或不帶協商的表示;相同設定不應盲目重試。伺服器限制深度、修正 variant,並監控 506 與 406。

分步驟深入解答

1. 解釋透明協商

RFC 2295 允許 origin server 發布可選 variant,客戶端和中間節點依請求標頭選擇 representation。最終請求必須收斂到具體資源。

2. 識別 506 循環

若 variant 又指向需要透明協商的資源,選擇會回到原始物件。記錄 resource URI、variant URI、協商代理、請求 id 和 visited 集合;再次訪問同一節點即可證明循環。

3. 區分相鄰狀態碼

406 表示沒有表示符合客戶端條件;502 表示閘道從上游得到無效回應。506 應追查協商層閉環,不能只依邊緣狀態碼判斷。

4. 設計客戶端回退

相同條件重試不會消除循環。客戶端可請求固定 variant、移除透明協商,或提示伺服器修復;只有設定變更或明確暫時訊號時才在預算內重試。

5. 處理快取與 Vary

快取鍵要包含實際協商的 Vary 維度,不能把 506 當成任意 representation 的長期結果。錯誤回應依 Cache-Control 決定;修復後要考慮舊快取和代理刷新。

6. 伺服器修復與安全

發布器上線前建 variant 圖並做環檢測,限制深度與時間。回應只給關聯 id,不暴露內部 URI 圖。代理保留原始狀態、Via 和 trace id。

7. 驗證與觀測

測試自循環、雙節點循環、深但無環列表、不同 Accept、語言、代理快取、灰度和回滾。監控 506/406、協商耗時、fallback、快取命中和修復時長。

高品質示範回答

506 是 RFC 2295 透明內容協商的循環錯誤。variant 再次指向協商資源時,伺服器無法得到最終表示。我會記錄 URI、variant、代理和 request id,用 visited 集合證明循環,並保存每跳原始狀態和 trace。

相同條件下客戶端快速失敗,不盲目重試;可請求固定 variant。伺服器發布前建 variant 圖做環檢測,限制深度和時間,校驗 Vary 與快取鍵。驗收覆蓋 Accept/語言、代理快取、灰度、回滾,以及 506 與 406 的區分。

常見錯誤

  • 把 506 當成 406 或 502。
  • 只看代理最終狀態,不追蹤 variant 圖。
  • 對同一協商設定無限重試。
  • 快取鍵缺少 Vary 維度。
  • 上線前沒有環檢測和深度限制。
  • 錯誤回應暴露內部 variant URI。

追問及應對

追問一:506 與 406 的差別?

406 是沒有可接受表示;506 是協商過程形成循環,選擇無法收斂。

追問二:客戶端能重試 506 嗎?

相同設定不應重試;只有修復設定或收到暫時訊號才在預算內重試。

追問三:如何證明是代理改碼?

比較每跳 trace、Via、原始狀態和協商標頭,必要時直連 origin 對照。

追問四:錯誤回應要不要快取?

遵循 Cache-Control,避免擴大循環;修復後清理受影響舊快取。

公開來源

同類題目