查看 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 診斷錯誤:
- 以使用者身分登入 Apigee Edge UI 適當角色。
切換到您要調查問題的機構。
- 前往「Analyze」(分析) >「API 監控 >調查頁面。
- 請選取您發現錯誤的確切時間範圍。
- 確認 Proxy 篩選器已設為「All」。
- 根據「時間」繪製「Fault Code」指標。
選取含有錯誤程式碼
protocol.http.DuplicateHeader
的儲存格 如下所示:錯誤代碼
protocol.http.DuplicateHeader
的相關資訊如下: 如下所示:- 按一下「查看記錄」,然後展開失敗要求的資料列。
- 在「Logs」(記錄檔) 視窗中,記下下列詳細資料:
- 狀態碼:
400
- 錯誤來源:
apigee
- 錯誤代碼:
protocol.http.DuplicateHeader
。
- 狀態碼:
- 如果錯誤來源的值
apigee
或MP
,錯誤代碼包含值protocol.http.DuplicateHeader
,表示 用戶端含有重複的標頭。
追蹤工具
NGINX
如何使用 NGINX 存取記錄診斷錯誤:
- 如果您是 Private Cloud 使用者,可以透過 NGINX 存取記錄檔判斷
提供 HTTP
400
錯誤的相關重要資訊。 查看 NGINX 存取記錄:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
其中: ORG、ENV 和 PORT# 會替換為 實際價值
- 搜尋並查看特定期間是否有任何
400
錯誤 (如果 發生錯誤) 或出現任何要求失敗時400
。 如果發現任何含有 X-Apigee-fault-code 的
400
錯誤 與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
原因:要求中的標頭重複
診斷
- 針對使用 API 觀察到的錯誤判斷「錯誤程式碼」和「錯誤來源」 監控或 NGINX 存取記錄,方法請見常見診斷步驟。
- 如果 Fault Source 的值為
apigee
或MP
,則 表示用戶端應用程式傳送至 Apigee 的要求含有重複項目 標題。 您可以使用以下程式碼,判斷在要求中傳送多次的實際標頭: 您可以選擇下列其中一種做法:
錯誤訊息
使用錯誤訊息
如果您可以存取 Apigee Edge 收到的完整錯誤訊息, 請參閱
faultstring
。faultstring
包含 傳送超過一次的標頭名稱。錯誤訊息示例:
"faultstring":"Duplicate Header \"Expires\""
- 在上述錯誤訊息中,您會看到
Expires
標頭 如faultstring
中所示,重複傳送。
實際要求
使用實際要求
如果您可以存取用戶端應用程式提出的實際要求,請 請執行下列步驟:
- 驗證要求中傳遞的標頭清單。
- 如果您發現某個標頭在 設定相同值或不同的值, 。
要求範例:
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
。- 此外,如果您可以存取用戶端記錄檔,也可以查看 實際向 Apigee Edge 發出的要求相關資訊,並判斷
解析度
修正重複問題
選項 #1 [建議選項] 修正用戶端應用程式,避免加入重複標頭
- 分析特定用戶端傳送重複標頭的原因。例如:
Expires
。確認 API Proxy 可接受 重複標題根據 HTTP 規格,通常不適合 RFC7230。 - 如果您不想傳送重複的標頭,請修改用戶端應用程式,不要傳送重複的標頭。
在上述範例中,我們發現標頭
Expires
已傳送 建立兩次,但這並非最理想的情況如要修正問題,請將Expires
標頭只會顯示一次,如下所示:curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
- 如果您想要允許的話,如要允許重複的標頭,請前往 選項 #2 使用 CwC 屬性。
CwC
選項 #2 使用 CwC 屬性
Apigee 提供
CwC 屬性 HTTPHeader.<HeaderName>
,可讓用戶端
應用程式和目標伺服器,以將重複的標頭傳送至 Apigee Edge 中的 API Proxy。
CwC 資源 | 值 |
---|---|
HTTPHeader.<HeaderName> |
allowDuplicates,multivalued |
舉例來說,您可以在「訊息處理器」中設定下列屬性,允許系統重複郵件,
標頭 Expires
有多個值。
HTTPHeader.Expires=allowDuplicates, multiValued
- 如果您是 Private Cloud 使用者,您可以設定這項屬性來
Apigee Edge 不會發出
400 Bad Request
錯誤,即使要求也不例外 標題中使用 設定郵件處理器以使用重複標頭的教學指南。 - 如果您是公用雲端使用者,請與 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
其中: ORG、ENV 和 PORT# 會替換為 實際價值
- 訊息處理器系統記錄
/opt/apigee/var/log/edge-message-processor/logs/system.log