400 要求無效 - 重複標頭

查看 Apigee Edge 說明文件。
前往 Apigee X說明文件
資訊

問題

用戶端應用程式收到 HTTP 狀態碼 400 Bad Request 和錯誤代碼 protocol.http.DuplicateHeader 做為 API 呼叫的回應。

錯誤訊息

用戶端應用程式會取得下列回應代碼:

HTTP/1.1 400 Bad Request

此外,您可能也會看到類似以下的錯誤訊息:

{
   "fault":{
      "faultstring":"Duplicate Header \"Expires\"",
      "detail":{
         "errorcode":"protocol.http.DuplicateHeader"
      }
   }
}

可能原因

如果特定 HTTP 標頭無法在 Apigee 中含有重複的值,就會發生這個錯誤 Edge 會在 複製到 Apigee Edge

截至 RFC 7230 的第 3.2.2 節:欄位順序 ,寄件者「不得」產生多個標頭 訊息中具有相同欄位名稱的欄位,除非該欄位的所有欄位值皆相同 標頭欄位的定義為以半形逗號分隔的清單,例如#(values)] 或是標頭欄位 如果 Apigee Edge 找到特定標頭,這個標頭就無法 傳回 400 Bad Request 和錯誤代碼 protocol.http.DuplicateHeader

以下是導致這個錯誤的可能原因:

原因 說明 適用的疑難排解操作說明
要求中的標頭重複 從用戶端應用程式向 Apigee 發出的 HTTP 要求含有重複的標頭。 邊緣公有雲和私有雲使用者

常見的診斷步驟

請使用下列其中一項工具/技巧診斷這個錯誤:

API Monitoring

如何使用 API Monitoring 診斷錯誤:

  1. 以使用者身分登入 Apigee Edge UI 適當角色
  2. 切換到您要調查問題的機構。

  3. 前往「Analyze」(分析) >「API 監控 >調查頁面。
  4. 請選取您發現錯誤的確切時間範圍。
  5. 確認 Proxy 篩選器已設為「All」
  6. 根據「時間」繪製「Fault Code」指標。
  7. 選取含有錯誤程式碼 protocol.http.DuplicateHeader 的儲存格 如下所示:

  8. 錯誤代碼 protocol.http.DuplicateHeader 的相關資訊如下: 如下所示:

  9. 按一下「查看記錄」,然後展開失敗要求的資料列。
  10. 在「Logs」(記錄檔) 視窗中,記下下列詳細資料:
    1. 狀態碼: 400
    2. 錯誤來源: apigee
    3. 錯誤代碼: protocol.http.DuplicateHeader
  11. 如果錯誤來源的值apigeeMP 錯誤代碼包含值 protocol.http.DuplicateHeader,表示 用戶端含有重複的標頭。

追蹤工具

NGINX

如何使用 NGINX 存取記錄診斷錯誤:

  1. 如果您是 Private Cloud 使用者,可以透過 NGINX 存取記錄檔判斷 提供 HTTP 400 錯誤的相關重要資訊。
  2. 查看 NGINX 存取記錄:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    其中: ORGENVPORT# 會替換為 實際價值

  3. 搜尋並查看特定期間是否有任何 400 錯誤 (如果 發生錯誤) 或出現任何要求失敗時 400
  4. 如果發現任何含有 X-Apigee-fault-code400 錯誤 與 protocol.http.DuplicateHeader 的值相符,然後 判斷 X-Apigee-fault-source. 的價值。

    NGINX 存取記錄中的 400 錯誤示例:

    上述 NGINX 存取記錄範例項目中的 X-Apigee- fault-code X-Apigee-fault-source:

    回應標頭
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source MP

原因:要求中的標頭重複

診斷

  1. 針對使用 API 觀察到的錯誤判斷「錯誤程式碼」和「錯誤來源」 監控或 NGINX 存取記錄,方法請見常見診斷步驟
  2. 如果 Fault Source 的值為 apigeeMP,則 表示用戶端應用程式傳送至 Apigee 的要求含有重複項目 標題。
  3. 您可以使用以下程式碼,判斷在要求中傳送多次的實際標頭: 您可以選擇下列其中一種做法:

    錯誤訊息

    使用錯誤訊息

    1. 如果您可以存取 Apigee Edge 收到的完整錯誤訊息, 請參閱 faultstringfaultstring 包含 傳送超過一次的標頭名稱。

      錯誤訊息示例:

      "faultstring":"Duplicate Header \"Expires\""
      
    2. 在上述錯誤訊息中,您會看到 Expires 標頭 如 faultstring 中所示,重複傳送。

    實際要求

    使用實際要求

    1. 如果您可以存取用戶端應用程式提出的實際要求,請 請執行下列步驟:

      1. 驗證要求中傳遞的標頭清單。
      2. 如果您發現某個標頭在 設定相同值或不同的值, 。

      要求範例:

      curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT" -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
      

      在上述要求範例中,標頭 Expires 傳送的次數超過 一次。因此,這項要求失敗並顯示 400 Bad Request 錯誤, 錯誤代碼:protocol.http.DuplicateHeader

    2. 此外,如果您可以存取用戶端記錄檔,也可以查看 實際向 Apigee Edge 發出的要求相關資訊,並判斷

解析度

修正重複問題

選項 #1 [建議選項] 修正用戶端應用程式,避免加入重複標頭

  1. 分析特定用戶端傳送重複標頭的原因。例如: Expires。確認 API Proxy 可接受 重複標題根據 HTTP 規格,通常不適合 RFC7230
  2. 如果您不想傳送重複的標頭,請修改用戶端應用程式,不要傳送重複的標頭。

    在上述範例中,我們發現標頭 Expires 已傳送 建立兩次,但這並非最理想的情況如要修正問題,請將 Expires 標頭只會顯示一次,如下所示:

    curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
    
  3. 如果您想要允許的話,如要允許重複的標頭,請前往 選項 #2 使用 CwC 屬性

CwC

選項 #2 使用 CwC 屬性

Apigee 提供 CwC 屬性 HTTPHeader.<HeaderName>,可讓用戶端 應用程式和目標伺服器,以將重複的標頭傳送至 Apigee Edge 中的 API Proxy。

CwC 資源
HTTPHeader.<HeaderName> allowDuplicates,multivalued

舉例來說,您可以在「訊息處理器」中設定下列屬性,允許系統重複郵件, 標頭 Expires 有多個值。

HTTPHeader.Expires=allowDuplicates, multiValued
  1. 如果您是 Private Cloud 使用者,您可以設定這項屬性來 Apigee Edge 不會發出 400 Bad Request 錯誤,即使要求也不例外 標題中使用 設定郵件處理器以使用重複標頭的教學指南。
  2. 如果您是公用雲端使用者,請與 Apigee Edge 支援團隊聯絡,以便設定這項屬性 以及組織資源

規格

Apigee 預期用戶端應用程式不會在要求中傳送重複的標頭 按照下列 RFC 規格定義:

規格
RFC 7230,第 3.2.2 節:欄位順序
RFC 7230,第 3.2 節標頭欄位

如果仍需 Apigee 支援團隊的協助,請前往 必須收集診斷資訊

必須收集診斷資訊

收集下列診斷資訊,然後與 Apigee Edge 支援團隊聯絡。

如果您是公有雲使用者,請提供下列資訊:

  • 機構名稱
  • 環境名稱
  • API Proxy 名稱
  • 完成 curl 指令 (用來重現 400 錯誤)
  • API 要求的追蹤檔

如果您是 Private Cloud 使用者,請提供下列資訊:

  • 偵測到失敗要求的完整錯誤訊息
  • 環境名稱
  • API Proxy 組合
  • 完成用來重現 400 錯誤的 curl 指令
  • API 要求的追蹤檔
  • NGINX 存取記錄:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    其中: ORGENVPORT# 會替換為 實際價值

  • 訊息處理器系統記錄 /opt/apigee/var/log/edge-message-processor/logs/system.log