400 Yêu cầu Không hợp lệ - DuplicateHeader

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 khách sẽ nhận được mã trạng thái HTTP 400 Bad Request kèm theo 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 sẽ 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 nếu một tiêu đề HTTP cụ thể không được phép có dữ liệu 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 như một phần của yêu cầu HTTP được gửi bởi khách hàng kết nối với Apigee Edge.

Theo RFC 7230, mục 3.2.2: Trường thứ tự, người gửi KHÔNG ĐƯỢC tạo nhiều tiêu đề các trường có cùng tên trường trong một thông báo trừ khi toàn bộ giá trị trường đó trường tiêu đề được định nghĩa là danh sách được phân tách bằng dấu phẩy, [ví dụ: #(values)] hoặc trường tiêu đề là ngoại lệ phổ biến. Nếu Apigee Edge tìm thấy một tiêu đề cụ thể, thì bạn không được phép dùng trùng lặp, nhiều hơn một lần trong yêu cầu HTTP do máy khách gửi, thì phản hồi bằng 400 Bad Request và mã lỗi protocol.http.DuplicateHeader.

Dưới đây là những nguyên nhân có thể gây ra lỗi này:

Nguyên nhân 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 công khai và riêng tư

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:

  1. Đăng nhập vào giao diện người dùng Apigee Edge với tư cách là người dùng có vai trò thích hợp.
  2. Chuyển sang tổ chức mà bạn muốn điều tra vấn đề này.

  3. Chuyển đến thẻ Analyze (Phân tích) > Giám sát API > Điều tra.
  4. Chọn khung thời gian cụ thể mà bạn phát hiện thấy lỗi.
  5. Đảm bảo rằng bộ lọc Proxy được đặt thành Tất cả.
  6. Vẽ Mã lỗi theo Thời gian.
  7. Chọn một ô có mã lỗi protocol.http.DuplicateHeader như minh hoạ dưới đây:

  8. Thông tin về mã lỗi protocol.http.DuplicateHeader là được hiển thị như sau:

  9. Nhấp vào Xem nhật ký và mở rộng hàng của yêu cầu không thành công.
  10. Từ cửa sổ Logs (Nhật ký), hãy lưu ý những thông tin chi tiết sau:
    1. Mã trạng thái: 400
    2. Nguồn lỗi: apigee
    3. Mã lỗi: protocol.http.DuplicateHeader.
  11. Nếu Nguồn lỗi có giá trị apigee hoặc MP Mã lỗi có giá trị đó protocol.http.DuplicateHeader, thì điều đó cho biết rằng yêu cầu HTTP từ máy khách 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:

  1. Nếu là người dùng Đám mây riêng tư, bạn có thể sử dụng nhật ký truy cập NGINX để xác định thông tin quan trọng về lỗi HTTP 400.
  2. Kiểm tra nhật ký truy cập NGINX:

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

    Vị trí: ORG, ENVPORT# được thay thế bằng giá trị thực tế.

  3. 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 sự cố đã xảy ra trong quá khứ) hoặc nếu có bất kỳ yêu cầu nào vẫn không thành công với 400.
  4. Nếu bạn tìm thấy bất kỳ lỗi 400 nào với X-Apigee-fault-code khớp với giá trị của protocol.http.DuplicateHeader, thì xác định giá trị của X-Apigee-fault-source.

    Lỗi 400 mẫu trong nhật ký truy cập NGINX:

    Mục nhập mẫu ở trên từ nhật ký Truy cập NGINX có các giá trị sau cho X-Apigee- error-codeX-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 đề trùng lặp trong yêu cầu

Chẩn đoán

  1. Xác định Mã lỗiNguồn lỗi cho lỗi phát hiện được bằng API Nhật ký giám sát hoặc nhật ký truy cập NGINX như giải thích trong Các bước chẩn đoán phổ biến.
  2. Nếu Nguồn lỗi có giá trị apigee hoặc MP, thì phương thức này cho biết yêu cầu mà ứng dụng gửi đến Apigee có chứa dữ liệu trùng lặp .
  3. 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 cách sử dụng một trong các phương pháp sau:

    Thông báo lỗi

    Sử dụng thông báo lỗi

    1. Nếu bạn có quyền xem thông báo lỗi hoàn chỉnh nhận được từ Apigee Edge, thì tham khảo faultstring. faultstring chứa đã được gửi nhiều lần.

      Thông báo lỗi mẫu:

      "faultstring":"Duplicate Header \"Expires\""
      
    2. Trong thông báo lỗi ở trên, bạn có thể thấy rằng tiêu đề Expires là gửi nhiều lần như đã xem trong faultstring.

    Yêu cầu thực tế

    Sử dụng yêu cầu thực tế

    1. 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, thì thực hiện các bước sau:

      1. Xác minh danh sách các tiêu đề được chuyển trong yêu cầu.
      2. Nếu bạn thấy rằng một tiêu đề cụ thể xuất hiện nhiều lần trong có cùng giá trị hoặc giá trị khác nhau , thì đó là nguyên nhân cho 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 mẫu ở trên, tiêu đề Expires được gửi nhiều hơn một lần. Do đó, yêu cầu này không thành công do lỗi 400 Bad Request và mã lỗi: protocol.http.DuplicateHeader.

    2. Ngoài ra, nếu có quyền truy cập vào nhật ký ứng dụng khách, 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 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 tiêu đề trùng lặp

  1. Phân tích lý do khiến ứng dụng cụ thể gửi một tiêu đề trùng lặp. Ví dụ: Expires trong trường hợp trên. Xác minh rằng việc chấp nhận proxy API tiêu đề bị trùng lặp. Thông thường, theo thông số kỹ thuật HTTP, điều này là không như mong muốn RFC7230.
  2. Nếu bạn không mong muốn, hãy sửa đổi ứng dụng của bạn để không gửi các tiêu đề trùng lặp.

    Trong ví dụ được thảo luận ở trên, bạn nhận thấy tiêu đề Expires đã được gửi hai lần có cùng giá trị. Đây không phải là điều đáng mong muốn. Bạn có thể khắc phục vấn đề này bằng cách chuyển Expires tiêu đề chỉ một lần như hình dưới đây:

    curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
    
  3. Nếu cần và bạn muốn cho phép 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

Lựa chọn 2 Sử dụng thuộc tính CwC

Apigee cung cấp Thuộc tính CwC HTTPHeader.<HeaderName> ,cho phép ứng dụng để 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 Trình xử lý thư để cho phép trùng lặp và nhiều giá trị cho tiêu đề Expires.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. Nếu là người dùng Đám mây riêng tư, bạn có thể định cấu hình tài sản đó để ngăn Apigee Edge khỏi việc đưa ra lỗi 400 Bad Request, ngay cả khi yêu cầu chứa tiêu đề trùng lặp bằng cách sử dụng Hướng dẫn cách định cấu hình Bộ xử lý thư để sử dụng tiêu đề trùng lặp.
  2. Nếu bạn là người dùng Public Cloud, hãy liên hệ với Bộ phận hỗ trợ Apigee Edge để định cấu hình thuộc tính này cho tổ chức của bạn.

Thông số kỹ thuật

Apigee muốn ứng dụng khách không gửi các tiêu đề trùng lặp trong yêu cầu theo các thông số RFC sau đây:

Thông số kỹ thuật
RFC 7230, mục 3.2.2: Thứ tự trường
RFC 7230, mục 3.2 Trường tiêu đề

Nếu bạn vẫn cần hỗ trợ từ Nhóm hỗ trợ Apigee, hãy truy cập vào 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 những thông tin chẩn đoán sau đây rồi liên hệ với Bộ phận hỗ trợ Apigee Edge.

Nếu bạn là người dùng Cloud Public, 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 hiện lỗi 400
  • 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 các thông tin sau:

  • Đã nhậ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ực hiện được
  • Tên môi trường
  • Gói proxy API
  • Hoàn tất lệnh curl bạn đã dùng để tái hiện lỗi 400
  • 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

    Vị trí: ORG, ENVPORT# được thay thế bằng giá trị thực tế.

  • Nhật ký hệ thống của Trình xử lý thư /opt/apigee/var/log/edge-message-processor/logs/system.log