查看 Apigee Edge 說明文件。
前往
Apigee X說明文件。 資訊
問題
用戶端應用程式收到 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" } } }
可能原因
如果用戶端應用程式傳送至 的所有要求標頭總大小,就會發生這個錯誤 做為 HTTP 要求的一部分的 Apigee Edge 大於 在 Apigee Edge 中允許的數量上限 RFC 6585,第 5 節:431 要求標頭欄位過大。
以下是導致這個錯誤的可能原因:
原因 | 說明 | 適用的疑難排解操作說明 |
---|---|---|
要求標頭大小超過允許的數量上限 | 用戶端應用程式在 HTTP 要求中,傳送的所有標頭大小總計 Apigee Edge 大於 Apigee Edge 中允許的數量上限。 | 邊緣公有雲和私有雲使用者 |
常見的診斷步驟
請使用下列其中一項工具/技巧診斷這個錯誤:
API Monitoring
如何使用 API Monitoring 診斷錯誤:
- 以下列使用者身分登入 Apigee Edge UI: 擔任適當角色
切換到您要調查問題的機構。
- 前往「Analyze」(分析) >「API 監控 >調查頁面。
- 請選取您發現錯誤的確切時間範圍。
- 根據「時間」繪製「Fault Code」指標。
- 選取含有錯誤程式碼
protocol.http.TooBigHeaders
的儲存格,並 狀態碼431
,如下所示:( 查看較大的圖片)
畫面上會顯示錯誤代碼
protocol.http.TooBigHeaders
的相關資訊 如下所示:( 查看較大的圖片)
按一下「查看記錄」,然後展開失敗要求的資料列:
( 查看較大的圖片)
在「Logs」(記錄檔) 視窗中,記下下列詳細資料:
- 狀態碼:
431
- 錯誤來源:
apigee
- 錯誤代碼:
protocol.http.TooBigHeaders
。 - 要求長度(位元組):
32150 (> 25 KB)
- 狀態碼:
- 如果 Fault Source 的值為
apigee
或MP
, 「Fault Code」的值為protocol.http.TooBigHeaders
和 要求長度超過 25 KB,表示 用戶端應用程式傳送的所有要求標頭,當做 HTTP 要求數量的一部分 比 在 Apigee 中允許的數量上限。
追蹤工具
NGINX
如何使用 NGINX 存取記錄診斷錯誤:
- 如果您是 Private Cloud 使用者,可以使用 NGINX 存取記錄
來判斷 HTTP
431
錯誤的相關重要資訊。 查看 NGINX 存取記錄:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
其中: ORG、ENV 和 PORT# 會替換為實際值。
- 搜尋,查看在特定期間是否有任何
431
錯誤 (如果問題是過去發生) 或者431
。 如果 X-Apigee-fault-code 未顯示任何
431
錯誤 比對protocol.http.TooBigHeaders
的值,然後 是 X-Apigee-fault-source. 的價值上述 NGINX 存取記錄的範例項目如下 X-Apigee-fault-code 和 X-Apigee-fault-code
回應標頭 值 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 數量上限。
原因:要求標頭大小超出允許的數量上限
診斷
- 判定 Fault Code、Fault Source 和 Request-Length size。 根據下列說明,使用 API 監控或 NGINX 存取記錄檔觀察到錯誤: 常見的診斷步驟。
- 如果「Fault Source」的值為
apigee
或MP
, 「Fault Code」 的值為protocol.http.TooBigHeaders
, 和 Request Length 的大小超過 25 KB,則 表示用戶端應用程式傳送至 Apigee 的要求大小大於 在 Apigee Edge 中允許限制。 - 您可以使用下列其中一個選項,驗證要求標頭大小是否超過 25 KB 的限制
方法如下:
錯誤訊息
如何使用錯誤訊息進行驗證:
如果您可以存取 Apigee Edge 收到的完整錯誤訊息, 請參閱
faultstring
。faultstring
表示 要求標頭的總大小超過允許的上限 (25 KB)。錯誤訊息示例:
"faultstring":"request headers size exceeding 25,600"
實際要求
如要使用實際要求進行驗證,請按照下列步驟操作:
如果您可以存取用戶端應用程式提出的實際要求, 然後執行下列步驟:
- 驗證要求中傳遞的標頭大小。
如果發現標題總大小超過 在 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 K ASCII 字元 (位元組)。如果您使用其他用戶端,可以查看用戶端記錄檔 請設法瞭解傳送至 Apigee Edge 的要求行大小。
訊息處理器記錄
如何使用訊息處理器記錄進行驗證:
如果您是私有雲使用者,可以透過訊息處理器的記錄檔 驗證要求標頭大小是否超過 在 Apigee Edge 中允許的限制。
查看訊息處理器記錄:
/opt/apigee/var/log/edge-message-processor/logs/system.log
- 搜尋,查看特定期間是否有任何
431
錯誤 期間 (如果問題過去發生) 或有任何請求 仍因431
失敗你可以使用以下搜尋字串。grep -ri "exceeding"
grep -ri "RequestHeadersTooLarge"
- 您會看到
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 [建議]:修正用戶端應用程式不要使用 總大小超過允許的數量上限
- 分析特定用戶端傳送大型要求標頭的原因 這導致標頭總大小超出 限制。
如果不是,請修改用戶端應用程式,將其從 要求標頭的大小小於允許的上限。
在上述範例中,如要修正問題,只要傳送長標頭 將值參數當做要求主體/酬載的一部分:
curl -v https://HOSTALIAS/test -d '{ "header0: 000000000000000000……..000000<trimmed>" , "header1: 111111111111111111……..111111<ttrimmed>" , "header2: 222222222222222222……..222222<ttrimmed>", "header3: 333333333333333333……..333333<ttrimmed>" }'
- 如果適用的話,您還想要傳送超過數量上限的標頭,請前往 下一個選項。
CwC
方法 #2:使用 CwC 屬性提高要求行數量上限
Apigee 提供 CwC 屬性,可提高要求行的大小限制。 詳情請參閱 設定訊息處理器的要求行限制
限制
Apigee 預期用戶端應用程式和後端伺服器不會傳送 要求/回應標頭的大小超過授權上限 (如文件所述) 中要求/回應標頭的大小上限 Apigee Edge 限制。
- 如果您是公有雲使用者,則 要求和回應標頭大小上記載於以下兩者的要求/回應標頭大小: Apigee Edge 限制。
- 如果您是 Private Cloud 使用者 ,可能已修改預設上限 要求和回應標頭的大小限制 (即使這不是建議做法)。 如需確認要求標頭大小上限,請參閱 如何查看目前的限制。
如何查看目前的限制?
本節說明如何驗證 HTTPRequest.headers.limit
資源
已透過訊息處理器上的新值進行更新。
- 在訊息處理器電腦上搜尋屬性
HTTPRequest.headers.limit
是/opt/apigee/edge-message-processor/conf
目錄,然後查看 各設定的值如下所示:grep -ri "HTTPRequest.headers.limit" /opt/apigee/edge-message-processor/conf
- 上述指令的結果範例如下:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPRequest.headers.limit=25k
在上方的輸出內容範例中,請注意屬性
HTTPRequest.headers.limit
已在http.properties
中設為25k
。這代表在 Apigee 中為不公開設定的要求標頭大小限制 雲端為 25 KB。
規格
Apigee Edge 會預期用戶端應用程式,不會在
請求。如果要求中的標頭總大小超過指定限制,
Apigee 會根據下列 RFC 擲回 431 Request Header Fields Too Large
規格:
規格 |
---|
RFC 6585,第 5 節:431 要求標頭欄位過大 |
如果仍需 Apigee 支援團隊的協助,請前往 必須收集診斷資訊。
必須收集診斷資訊
收集下列診斷資訊,然後與 Apigee Edge 支援團隊聯絡:
如果您是公有雲使用者,請提供下列資訊:
- 機構名稱
- 環境名稱
- API Proxy 名稱
- 完成
curl
指令 (用來重現431
錯誤) - API 要求的追蹤檔
如果您是 Private Cloud 使用者,請提供下列資訊:
- 偵測到失敗要求的完整錯誤訊息
- 機構名稱
- 環境名稱
- API Proxy 套裝組合
- 失敗 API 要求的追蹤檔
- 完成
curl
指令 (用來重現431
錯誤) 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