Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến tài liệu về
Apigee X. thông tin
Triệu chứng
Ứng dụng sẽ nhận được mã trạng thái HTTP 400 Bad Request
với mã lỗi protocol.http.DuplicateHeader
làm phản hồi cho lệnh gọi API.
Thông báo lỗi
Ứng dụng khách nhận được mã phản hồi sau đây:
HTTP/1.1 400 Bad Request
Ngoài ra, bạn có thể thấy một thông báo lỗi tương tự như thông báo dưới đây:
{ "fault":{ "faultstring":"Duplicate Header \"Expires\"", "detail":{ "errorcode":"protocol.http.DuplicateHeader" } } }
Các nguyên nhân có thể
Lỗi này xảy ra khi một tiêu đề HTTP cụ thể không được phép trùng lặp trong Apigee Edge, xuất hiện nhiều lần với các giá trị giống nhau hoặc khác nhau trong yêu cầu HTTP do ứng dụng khách gửi đến Apigee Edge.
Theo
RFC 7230, section 3.2.2: Field Order, a người gửi KHÔNG ĐƯỢC tạo nhiều trường tiêu đề có cùng tên trường trong thư trừ khi toàn bộ giá trị trường cho trường tiêu đề đó được định nghĩa là danh sách phân tách bằng dấu phẩy, [i.e., #(values)] hoặc trường tiêu đề là một ngoại lệ phổ biến. Nếu Apigee Edge tìm thấy một tiêu đề cụ thể và không được phép có tiêu đề trùng lặp nhiều lần trong yêu cầu HTTP do ứng dụng gửi, thì quá trình này sẽ phản hồi bằng 400 Bad Request
và mã lỗi protocol.http.DuplicateHeader
.
Dưới đây là một số nguyên nhân có thể gây ra lỗi này:
Nguyên nhân | Nội dung mô tả | Hướng dẫn khắc phục sự cố áp dụng cho |
---|---|---|
Tiêu đề trùng lặp trong yêu cầu | Yêu cầu HTTP từ ứng dụng khách đến Apigee có chứa các tiêu đề trùng lặp. | Người dùng Edge Public và Private Cloud |
Các bước chẩn đoán phổ biến
Hãy sử dụng một trong các công cụ/kỹ thuật sau để chẩn đoán lỗi này:
Giám sát API
Cách chẩn đoán lỗi bằng tính năng Giám sát API:
- Đăng nhập vào giao diện người dùng Apigee Edge với tư cách là một người dùng có vai trò thích hợp.
Chuyển sang tổ chức mà bạn muốn điều tra vấn đề.
- Chuyển đến trang Phân tích > Giám sát API > Điều tra.
- Chọn khung thời gian cụ thể mà bạn quan sát thấy lỗi.
- Đảm bảo rằng Bộ lọc Proxy được đặt thành Tất cả.
- Vẽ Mã lỗi dựa trên Thời gian.
Chọn một ô có mã lỗi
protocol.http.DuplicateHeader
như minh hoạ dưới đây:Thông tin về mã lỗi
protocol.http.DuplicateHeader
hiển thị như sau:- Nhấp vào Xem nhật ký rồi mở rộng hàng cho yêu cầu không thành công.
- Trong cửa sổ Logs (Nhật ký), hãy lưu ý những thông tin sau:
- Mã trạng thái:
400
- Nguồn lỗi:
apigee
- Mã lỗi:
protocol.http.DuplicateHeader
.
- Mã trạng thái:
- Nếu Nguồn lỗi có giá trị
apigee
hoặcMP
và Mã lỗi có giá trịprotocol.http.DuplicateHeader
, thì tức là yêu cầu HTTP từ ứng dụng chứa các tiêu đề trùng lặp.
Công cụ theo dõi
NGINX
Cách chẩn đoán lỗi bằng nhật ký truy cập NGINX:
- Nếu là người dùng Đám mây riêng tư, bạn có thể dùng nhật ký truy cập NGINX để xác định thông tin chính về lỗi HTTP
400
. Kiểm tra nhật ký truy cập NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Trong đó: ORG, ENV và PORT# được thay thế bằng giá trị thực tế.
- Tìm kiếm xem có lỗi
400
nào trong một khoảng thời gian cụ thể hay không (nếu vấn đề đã xảy ra trong quá khứ) hoặc có yêu cầu nào vẫn không thành công với400
hay không. Nếu bạn tìm thấy bất kỳ lỗi
400
nào có X-Apigee-fault-code khớp với giá trị củaprotocol.http.DuplicateHeader
, thì hãy xác định giá trị của X-Apigee-fault-source.Ví dụ về lỗi 400 trong nhật ký truy cập NGINX:
Mục mẫu ở trên từ nhật ký Truy cập NGINX có các giá trị sau đây cho X-Apigee- fault-code và X-Apigee-fault-source:
Tiêu đề phản hồi Giá trị X-Apigee-fault-code protocol.http.DuplicateHeader
X-Apigee-fault-source MP
Nguyên nhân: Tiêu đề bị trùng lặp trong yêu cầu
Chẩn đoán
- Xác định Mã lỗi và Nguồn lỗi cho lỗi quan sát được bằng tính năng Giám sát API hoặc nhật ký truy cập NGINX như giải thích trong phần Các bước chẩn đoán thường gặp.
- Nếu Nguồn lỗi có giá trị
apigee
hoặcMP
, thì tức là yêu cầu do ứng dụng khách gửi đến Apigee chứa các tiêu đề trùng lặp. Bạn có thể xác định tiêu đề thực tế được gửi nhiều lần trong yêu cầu bằng một trong các phương thức sau:
Thông báo lỗi
Sử dụng thông báo lỗi
Nếu bạn có quyền truy cập vào thông báo lỗi đầy đủ mà Apigee nhận được từ Apigee, hãy tham khảo
faultstring
.faultstring
chứa tên tiêu đề đã được gửi nhiều lần.Mẫu thông báo lỗi:
"faultstring":"Duplicate Header \"Expires\""
- Trong thông báo lỗi ở trên, bạn có thể thấy tiêu đề
Expires
được gửi nhiều lần như trongfaultstring
.
Yêu cầu thực tế
Sử dụng yêu cầu thực tế
Nếu bạn có quyền truy cập vào yêu cầu thực tế do ứng dụng đưa ra, hãy thực hiện các bước sau:
- Xác minh danh sách các tiêu đề được chuyển trong yêu cầu.
- Nếu bạn nhận thấy một tiêu đề cụ thể xuất hiện nhiều lần trong yêu cầu có cùng giá trị hoặc các giá trị khác nhau , thì đó chính là nguyên nhân gây ra lỗi này.
Yêu cầu mẫu:
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"
Trong yêu cầu ví dụ trên, tiêu đề
Expires
được gửi nhiều lần. Do đó, yêu cầu này không thành công với lỗi400 Bad Request
và mã lỗi:protocol.http.DuplicateHeader
.- Ngoài ra, nếu có quyền truy cập vào nhật ký ứng dụng, bạn có thể xem liệu mình có thông tin về yêu cầu thực tế được gửi đến Apigee Edge hay không và xác định tiêu đề đã được gửi nhiều lần.
Độ phân giải
Khắc phục vấn đề trùng lặp
Lựa chọn 1 [Lựa chọn được đề xuất] Khắc phục ứng dụng khách để không chứa các tiêu đề trùng lặp
- Phân tích lý do khiến khách hàng cụ thể gửi tiêu đề trùng lặp. Ví dụ:
Expires
trong trường hợp trên. Xác minh rằng các proxy API có thể chấp nhận tiêu đề trùng lặp. Thông thường, bạn không nên đáp ứng yêu cầu này theo thông số kỹ thuật HTTP RFC7230. - Nếu điều này là không mong muốn, hãy sửa đổi ứng dụng khách của bạn để không gửi các tiêu đề trùng lặp.
Trong ví dụ thảo luận ở trên, bạn có thể thấy rằng tiêu đề
Expires
được gửi hai lần với cùng một giá trị. Đây là điều không mong muốn. Bạn có thể khắc phục vấn đề này bằng cách chỉ truyền tiêu đềExpires
một lần như minh hoạ dưới đây:curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
- Nếu điều này là mong muốn và bạn muốn cho phép các tiêu đề trùng lặp, hãy chuyển đến Lựa chọn 2 Sử dụng thuộc tính CwC.
CwC
Cách 2 Sử dụng tài sản CwC
Apigee cung cấp một thuộc tính
CwC HTTPHeader.<HeaderName>
. Thuộc tính này cho phép các ứng dụng khách và máy chủ đích gửi tiêu đề trùng lặp đến các proxy API trong Apigee Edge.
Tài sản CwC | Giá trị |
---|---|
HTTPHeader.<HeaderName> |
allowDuplicates,multivalued |
Ví dụ: Bạn có thể đặt thuộc tính sau trên Bộ xử lý thư để cho phép trùng lặp và nhiều giá trị cho tiêu đề Expires
.
HTTPHeader.Expires=allowDuplicates, multiValued
- Nếu là người dùng Đám mây riêng tư, bạn có thể định cấu hình thuộc tính này để ngăn không cho quá trình Apigee Edge phát sinh lỗi
400 Bad Request
, ngay cả khi yêu cầu chứa các tiêu đề trùng lặp bằng cách xem hướng dẫn cách Định cấu hình bộ xử lý tin nhắn để dùng tiêu đề trùng lặp. - Nếu bạn là người dùng Cloud công khai, hãy liên hệ với Nhóm hỗ trợ Apigee để định cấu hình tài sản này cho tổ chức của bạn.
Thông số kỹ thuật
Apigee dự kiến ứng dụng không gửi các tiêu đề trùng lặp trong yêu cầu theo các thông số kỹ thuật RFC sau đây:
Thông số kỹ thuật |
---|
RFC 7230, mục 3.2.2: Đơn đặt hàng thực tế |
RFC 7230, mục 3.2 Trường tiêu đề |
Nếu bạn vẫn cần Nhóm hỗ trợ Apigee hỗ trợ, hãy truy cập trang Phải thu thập thông tin chẩn đoán.
Phải thu thập thông tin chẩn đoán
Thu thập thông tin chẩn đoán sau đây rồi liên hệ với Bộ phận hỗ trợ Apigee.
Nếu bạn là người dùng Public Cloud, hãy cung cấp những thông tin sau:
- Tên tổ chức
- Tên môi trường
- Tên proxy API
- Hoàn tất lệnh
curl
dùng để tái tạo lỗi400
- Tệp theo dõi cho các yêu cầu API
Nếu bạn là người dùng Đám mây riêng tư, hãy cung cấp những thông tin sau:
- Đã phát hiện thấy thông báo lỗi hoàn chỉnh đối với các yêu cầu không thành công
- Tên môi trường
- Gói proxy API
- Hoàn tất lệnh
curl
mà bạn đã dùng để tái hiện lỗi400
- Tệp theo dõi cho các yêu cầu API
Nhật ký truy cập NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Trong đó: ORG, ENV và PORT# được thay thế bằng giá trị thực tế.
- Nhật ký hệ thống của Bộ xử lý thư
/opt/apigee/var/log/edge-message-processor/logs/system.log