431 Request Header Fields Too Large - TooBigHeaders

您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件。
info

問題

用戶端應用程式會收到 HTTP 狀態碼 431 Request Header Fields Too Large,以及錯誤代碼 protocol.http.TooBigHeaders ,做為 API 呼叫的回應。

錯誤訊息

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

HTTP/1.1 431 Request Header Fields Too Large

此外,您可能會看到下列錯誤訊息:

{
   "fault":{
      "faultstring":"request headers size exceeding 25,600",
      "detail":{
         "errorcode":"protocol.http.TooBigHeaders"
      }
   }
}

可能原因

如果用戶端應用程式傳送至 Apigee Edge 的所有要求標頭總大小,超出 Apigee Edge 允許的限制,就會發生這個錯誤。根據 RFC 6585 第 5 節:431 Request Header Fields Too Large,

這項錯誤的可能原因如下:

原因 說明 適用於以下裝置的疑難排解說明
要求標頭大小超過允許的上限 用戶端應用程式在 HTTP 要求中傳送至 Apigee Edge 的所有標頭總大小,大於 Apigee Edge 允許的上限。 Edge 公有和私有雲使用者

常見的診斷步驟

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

API Monitoring

如要使用 API 監控功能診斷錯誤,請按照下列步驟操作:

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

  3. 依序前往「Analyze」>「API Monitoring」>「Investigate」頁面。
  4. 選取您觀察到錯誤的特定時間範圍。
  5. 繪製「錯誤代碼」與「時間」的關係圖。
  6. 選取含有故障代碼 protocol.http.TooBigHeaders 和狀態碼 431 的儲存格,如下所示:

    ( 查看較大圖片)

  7. 您會看到故障代碼的相關資訊,如下所示:protocol.http.TooBigHeaders

    ( 查看較大圖片)

  8. 按一下「查看記錄」,然後展開失敗要求所在的資料列:

    ( 查看較大圖片)

  9. 在「記錄」視窗中,請注意下列詳細資料:

    • 狀態碼: 431
    • 錯誤來源: apigee
    • 故障代碼: protocol.http.TooBigHeaders。
    • 要求長度(位元組): 32150 (> 25 KB)
  10. 如果「錯誤來源」的值為 apigee 或 MP,「錯誤代碼」的值為 protocol.http.TooBigHeaders,且「要求長度」超過 25 KB,表示用戶端應用程式在 HTTP 要求中傳送的所有要求標頭總大小,超過 Apigee 允許的限制。

追蹤工具

NGINX

如要使用 NGINX 存取記錄診斷錯誤,請按照下列步驟操作:

  1. 如果您是私有雲使用者,可以透過 NGINX 存取記錄判斷 HTTP 431 錯誤的相關金鑰資訊。
  2. 檢查 NGINX 存取記錄:

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

    說明: ORG、ENV 和 PORT# 會替換為實際值。

  3. 搜尋特定時間範圍內是否有任何431錯誤 (如果問題發生在過去),或是否有任何要求仍431失敗。
  4. 如果發現任何 431 錯誤,且 X-Apigee-fault-code 與 protocol.http.TooBigHeaders 的值相符,請判斷 X-Apigee-fault-source 的值。

    上述 NGINX 存取記錄檔的範例項目具有下列 X-Apigee-fault-code 和 X-Apigee-fault-source 值:

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

    請注意要求長度: 40159 (40 KB 大於 25 KB,這是 Apigee Edge 中要求標頭的允許上限)

    在上述範例記錄項目中,X-Apigee-fault-source 的值為 apigee 或 MP,X-Apigee-fault-code 的值為 protocol.http.TooBigHeaders,且「Request Length」(要求長度) 為 40 KB,大於 Apigee 允許的上限 25 KB。這清楚指出,用戶端應用程式在 HTTP 要求中傳送的所有要求標頭總大小,已超過 Apigee Edge 允許的 25 KB 上限。

原因:要求標頭大小超過允許的上限

診斷

  1. 使用 API 監控或 NGINX 存取記錄,判斷觀察到的錯誤的錯誤代碼、錯誤來源和要求長度大小,如「常見診斷步驟」一文所述。
  2. 如果「Fault Source」(錯誤來源) 的值為 apigee 或 MP、「Fault Code」(錯誤代碼) 的值為 protocol.http.TooBigHeaders,且「Request Length」(要求長度) 超過 25 KB,表示用戶端應用程式傳送至 Apigee 的要求大小超過 Apigee Edge 允許的上限。
  3. 如要驗證要求標頭大小是否超過 25 KB 的上限,請使用下列任一方法:

    錯誤訊息

    如何使用錯誤訊息進行驗證:

    如果您可以存取 Apigee Edge 傳送的完整錯誤訊息,請參閱 faultstring。faultstring 表示要求標頭的總大小超出 25 KB 的上限。

    錯誤訊息範例:

    "faultstring":"request headers size exceeding 25,600"

    實際要求

    如要使用實際要求進行驗證,請按照下列步驟操作:

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

    1. 確認要求中傳遞的標頭大小。
    2. 如果發現標頭總大小超過 Apigee Edge 允許的上限,這就是問題的原因。

      要求範例:

      curl -v https://HOSTALIAS/test -H "header0: 000000000000000000……..000000<trimmed>" -H "header1: 111111111111111111……..111111<trimmed>" -H "header2: 222222222222222222……..222222<trimmed>"-H "header3: 333333333333333333……..333333<trimmed>"
      

      在上述情況中,標頭 header0、header1、header2 和 header3 的總大小超過 25 KB,也就是包含超過 25,000 個 ASCII 字元 (位元組)。

      如果您使用其他用戶端,可以查看用戶端記錄,嘗試找出傳送至 Apigee Edge 的要求行大小。

    訊息處理器記錄

    如要使用訊息處理器記錄進行驗證:

    如果您是 Private Cloud 使用者,可以透過訊息處理器記錄驗證「要求標頭」大小是否超過 Apigee Edge 允許的上限。

    1. 檢查訊息處理器記錄:

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    2. 搜尋特定時間範圍內是否有任何 431 錯誤 (如果問題發生在過去),或是否有任何要求仍失敗並顯示 431。您可以使用下列搜尋字串。
      grep -ri "exceeding"
      
      grep -ri "RequestHeadersTooLarge"
      
    3. 您會找到類似下列的 system.log 行:
      2021-07-27 08:30:28,419  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractRequestListener.onException() :
      Request:GET, uri:/test/, message Id:null,
      exception:com.apigee.errors.http.user.RequestHeadersTooLarge{
      code = protocol.http.TooBigHeaders, message = request headers size
      exceeding 25,600, associated contexts = []}, context:Context@9c5903
      input=ClientInputChannel(SSLClientChannel[Accepted:
      Remote:192.168.205.251:8443 Local:192.168.67.23:22188]@25130
      useCount=1 bytesRead=0 bytesWritten=15367 age=667062ms  lastIO=0ms
      isOpen=true)

      上述錯誤訊息中的文字 message = request headers size exceeding 25,600 表示要求標頭總大小超過 25 KB。因此,Apigee Edge 會擲回例外狀況 com.apigee.errors.http.user.RequestHeadersTooLarge,並傳回 431 狀態碼和錯誤代碼 protocol.http.TooBigHeaders 給用戶端應用程式。

解析度

修正大小

選項 1 (建議):修正用戶端應用程式,不要傳送總大小超過允許上限的要求標頭

  1. 分析特定用戶端傳送大型要求標頭的原因,這會導致標頭總大小超過「限制」中定義的允許上限。
  2. 如果不想這樣做,請修改用戶端應用程式,讓傳送的要求標頭大小低於允許的限制。

    在上述範例中,您可以將長標頭值參數做為要求主體/酬載的一部分傳遞,藉此修正問題:

    curl -v https://HOSTALIAS/test -d '{ "header0: 000000000000000000……..000000<trimmed>" , "header1: 111111111111111111……..111111<ttrimmed>" , "header2: 222222222222222222……..222222<ttrimmed>", "header3: 333333333333333333……..333333<ttrimmed>" }'
    
  3. 如果需要傳送的標頭超過上限,請前往下一個選項。

CwC

方法 2:使用 CwC 屬性提高要求行限制

Apigee 提供 CwC 屬性,可提高要求行大小上限。 詳情請參閱「 在訊息處理器上設定要求行限制」。

限制

Apigee 預期用戶端應用程式和後端伺服器不會傳送大小超出允許上限的要求/回應標頭,如 Apigee Edge 限制中要求/回應標頭大小限制的說明。

  1. 如果您是公有雲使用者,要求和回應標頭大小上限與 Apigee Edge 限制中要求/回應標頭大小的規定相同。
  2. 如果您是私有雲使用者 ,可能已修改要求和回應標頭大小的預設上限 (即使不建議這麼做)。請按照「如何查看目前限制」一文中的操作說明,判斷要求標頭大小上限。

如何查看目前的限制?

本節說明如何確認訊息處理器上的屬性 HTTPRequest.headers.limit 已更新為新值。

  1. 在訊息處理器電腦上,搜尋 /opt/apigee/edge-message-processor/conf 目錄中的 HTTPRequest.headers.limit 屬性,然後檢查已設定的值,如下所示:
    grep -ri "HTTPRequest.headers.limit" /opt/apigee/edge-message-processor/conf
    
  2. 上述指令的範例結果如下:
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPRequest.headers.limit=25k
  3. 在上述輸出範例中,請注意屬性 HTTPRequest.headers.limit 已在 http.properties 中設為 25k 值。

    這表示在 Apigee for Private Cloud 中,要求標頭大小的上限為 25 KB。

規格

Apigee Edge 預期用戶端應用程式不會在要求中傳送大型標頭。如果要求包含的標頭總大小超過指定限制,Apigee 會根據下列 RFC 規格擲回 431 Request Header Fields Too Large :

規格
RFC 6585 第 5 節:431 要求標頭欄位過大

如果仍需要 Apigee 支援團隊協助,請參閱「必須收集診斷資訊」。

必須收集診斷資訊

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

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

  • 機構名稱
  • 環境名稱
  • API Proxy 名稱
  • 用於重現 431 錯誤的完整 curl 指令
  • API 要求的追蹤記錄檔

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

  • 失敗要求顯示的完整錯誤訊息
  • 機構名稱
  • 環境名稱
  • API Proxy 套裝組合
  • 失敗 API 要求的追蹤記錄檔
  • 用於重現 431 錯誤的完整 curl 指令
  • 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