414 Request-URI Too Long - TooBigLine

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

問題

用戶端應用程式收到 HTTP 狀態碼 414 Request-URI Too Long, 錯誤代碼 protocol.http.TooBigLine 做為 API 呼叫的回應。

錯誤訊息

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

HTTP/1.1 414 Request-URI Too Long

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

{
   "fault":{
      "faultstring":"request line size exceeding 7,168",
      "detail":{
         "errorcode":"protocol.http.TooBigLine"
      }
   }
}

請注意,上述錯誤訊息中的 faultstring 含有允許的數量上限 針對 Apigee Edge 中的要求行,即 7168 bytes (7 KB)。

可能原因

如果用戶端應用程式向 Apigee Edge 傳送的要求行大小,就會發生這個錯誤 做為 HTTP 要求的一部分,超出 Apigee Edge 中允許的數量上限

在探討這項錯誤的可能原因前,讓我們先瞭解要求行 以及如何檢查其大小

瞭解要求行

一般 HTTP 要求包含三個部分:

  1. 要求行
  2. ( HTTP 標頭集合)
  3. [ 內文 ]

要求行包含三個部分,如下所示。

Request-Line = <Method> <Request-URI> <HTTP-Version>

當用戶端應用程式向伺服器發出 HTTP 要求時,第一行傳送至伺服器 伺服器包含上述的 Request-Line。後面接著 標頭和要求主體/酬載

以下範例螢幕截圖顯示的是一般 curl 要求、要求 (以及 Request-Line) 和 Response 部分。

瞭解要求行大小

  1. 在上述範例中,要求中的 start 行 (第一行),以及 稱為 Request-Line,如下所示:
    GET /test/ HTTP/1.1
    

    要求行的大小為 ~19 bytes,因為其中包含 19 ASCII characters。由於此屬性位於 限制在 Apigee Edge 內允許的上限,表示要求在處理時不會發生任何錯誤 你會得到成功的回應

  2. 同樣地,如果您查看 中的 faultstring 上方顯示的錯誤訊息,其中包含 "request line size exceeding 7,168"。 這表示用戶端所發出 HTTP 要求中的 Request-Line 超過負荷 7,168 個位元組。

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

原因 說明 適用的疑難排解操作說明
要求酬載大小超過允許的上限 用戶端應用程式在 HTTP 中傳送的要求 URI 大小 傳送至 Apigee Edge 的要求大於 Apigee Edge 中允許的限制數量。 邊緣公有雲和私有雲使用者

常見的診斷步驟

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

API Monitoring

如何使用 API Monitoring 診斷錯誤:

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

  3. 前往「Analyze」(分析) >「API 監控 >調查頁面。
  4. 請選取您發現錯誤的確切時間範圍。
  5. 根據「時間」繪製「Fault Code」指標。
  6. 選取含有錯誤程式碼 protocol.http.TooBigLine 的儲存格,並 狀態碼 414,如下所示:

    ( 查看較大的圖片)

  7. 畫面上會顯示錯誤代碼 protocol.http.TooBigline 的相關資訊 如下所示:

    ( 查看較大的圖片)

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

    ( 查看較大的圖片)

  9. 在「Logs」(記錄檔) 視窗中,記下下列詳細資料:

    • 狀態碼: 414
    • 錯誤來源: apigee
    • 錯誤代碼: protocol.http.TooBigLine
    • 要求長度(位元組): 7244 (> 7KB)
  10. 如果 Fault Source 的值為 apigeeMP, 「Fault Code」的值為 protocol.http.TooBigLineRequest-Length 超過 7 KB,表示 HTTP 要求 來自用戶端的要求 URI 大於 在 Apigee 中允許的數量上限

追蹤工具

NGINX

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

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

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

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

  3. 搜尋,查看在特定期間是否有任何 414 錯誤 (如果問題是過去發生) 或者 414
  4. 如果 X-Apigee-fault-code 未顯示任何 414 錯誤 比對 protocol.http.TooBigLine 的值,然後 是 X-Apigee-fault-source. 的價值

    上述 NGINX 存取記錄的範例項目如下 X-Apigee-fault-code X-Apigee-fault-code

    回應標頭
    X-Apigee-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source policy

    注意要求長度: 7244 (7.244KB > 允許的上限)

原因:要求酬載大小超過允許的上限

診斷

  1. 判定 Fault CodeFault SourceRequest-Length size。 您在使用 API 監控、追蹤工具或 NGINX 存取記錄檔時觀察到錯誤,詳情請參閱 常見的診斷步驟
  2. 如果 Fault Source 的值為 apigeeMP,則 表示用戶端應用程式傳送至 Apigee 的要求大小大於 在 Apigee Edge 中允許限制
  3. 您可以使用下列其中一個選項,驗證要求行大小是否超過 7 KB 的限制 方法如下:

    錯誤訊息

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

    如果您可以存取 Apigee Edge 收到的完整錯誤訊息, 請參閱 faultstringfaultstring 表示 請求行大小超過允許的上限 (7 KB)。

    錯誤訊息示例:

    "faultstring":"request line size exceeding 7,168"
    

    實際要求

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

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

    1. 請確認要求中傳遞的 URI 大小。
    2. 如果發現 URI 大小超過 在 Apigee Edge 中允許限制,則 造成問題的原因

      要求範例:

      curl http://<hostalias>/testtoobigline?_qparam=000000000000000000……..000000<trimmed> -k -X POST
      

      在上述情況下,查詢參數 qparam 的值 超過 7 KB,也就是超過 7 K ASCII 字元。

      如果您使用其他用戶端,可以查看用戶端記錄檔 請設法瞭解傳送至 Apigee Edge 的要求行大小。

    訊息處理器記錄

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

    如果您是私有雲使用者,可以透過訊息處理器的記錄檔 驗證請求行大小是否超過 在 Apigee Edge 中允許的限制

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

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

    2. 搜尋,查看特定期間是否發生任何 414 錯誤 期間 (如果問題過去發生) 或有任何請求 仍因 414 失敗你可以使用以下搜尋字串。
      grep -ri "exceeding"
      
      grep -ri "RequestURITooLong"
      
    3. 您會看到 system.log 中的行,如下所示:
      2021-07-12 08:53:31,461  NIOThread@0 ERROR ADAPTORS.HTTP.FLOW -
      AbstractRequestListener.onException() : Request:null, uri:null,
      message Id:null, exception:com.apigee.errors.http.user.RequestURITooLong{
      code = protocol.http.TooBigLine, message = request line size exceeding 7,168,
      associated contexts = []}, context:Context@366f4217
      input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.195.90:8443
      Local:192.168.67.23:34256]@301912 useCount=1 bytesRead=0 bytesWritten=45849
      age=2254670ms lastIO=0ms isOpen=true)
      

      message = request line size exceeding 7,168 行 表示要求 URI 大小超過 7 KB。 因此,Apigee Edge 會擲回例外狀況 com.apigee.errors.http.user.RequestURITooLong 和退貨 414 狀態碼 (含錯誤代碼 protocol.http.TooBigline ) 傳送至用戶端應用程式。

解析度

修正大小

方法 #1 [建議]:修正用戶端應用程式傳送要求 URI 大小超過允許上限的問題

  1. 分析特定用戶端傳送要求 URI 大小的原因 允許的數量上限 (如限制中所定義)。
  2. 如果不是,請修改用戶端應用程式,使其傳送要求 URI 大於允許的尺寸上限

    在上述範例中,如要修正問題,您可以傳送長查詢 參數做為要求主體/酬載的一部分,而不會將其做為 要求網址,如下所示:

    curl https://<host>/testtoobigline -k -X GET -d '{_qparam=000000000000000000<trimmed>}' -v
    
  3. 如果您要傳送 URI 超過允許的數量上限,請前往 下一步。

CwC

方法 #2:使用 CwC 屬性提高要求行數量上限

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

限制

Apigee 預期用戶端應用程式和後端伺服器不會傳送要求/回應行 大小超出要求/回應行數限制所述的允許上限 在 Apigee Edge 限制中。

  1. 如果您是 Public Cloud 使用者,則要求與要求的上限 回應行大小如以下所示的 Request/Response-Line 大小Apigee Edge 限制
  2. 如果您是 Private Cloud 使用者 ,可能已修改預設上限 請求和回應行的大小限制 (即使並非建議做法)。 您可以按照 如何查看目前的限制

如何查看目前的限制?

本節說明如何驗證 HTTPRequest.line.limit 資源 已透過訊息處理器上的新值進行更新。

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

    這表示在 Apigee 中為不公開的請求行大小限制 雲端是 7 KB

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

必須收集診斷資訊

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

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

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

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

  • 偵測到失敗要求的完整錯誤訊息
  • 機構名稱
  • 環境名稱
  • API Proxy 套裝組合
  • 失敗 API 要求的追蹤檔
  • 完成 curl 指令 (用來重現 414 錯誤)
  • NGINX 存取記錄 /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

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

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