400 คําขอไม่ถูกต้อง - DuplicateHeader

คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่ เอกสารประกอบของ Apigee X
info

ลักษณะปัญหา

แอปพลิเคชันไคลเอ็นต์ได้รับรหัสสถานะ HTTP 400 Bad Request พร้อมรหัสข้อผิดพลาด protocol.http.DuplicateHeader เป็นการตอบกลับสำหรับการเรียก API

ข้อความแสดงข้อผิดพลาด

แอปพลิเคชันไคลเอ็นต์ได้รับโค้ดตอบกลับต่อไปนี้

HTTP/1.1 400 Bad Request

นอกจากนี้ คุณอาจเห็นข้อความแสดงข้อผิดพลาดที่คล้ายกับข้อความที่แสดงด้านล่าง

{
   "fault":{
      "faultstring":"Duplicate Header \"Expires\"",
      "detail":{
         "errorcode":"protocol.http.DuplicateHeader"
      }
   }
}

สาเหตุที่เป็นไปได้

ข้อผิดพลาดนี้เกิดขึ้นหากส่วนหัว HTTP ที่เฉพาะเจาะจงซึ่งไม่อนุญาตให้มีรายการที่ซ้ำกันใน Apigee Edge ปรากฏมากกว่า 1 ครั้งโดยมีค่าเดียวกันหรือค่าที่แตกต่างกันซึ่งเป็นส่วนหนึ่งของคำขอ HTTP ที่ไคลเอ็นต์ส่งไปยัง Apigee Edge

ตาม RFC 7230 ส่วนที่ 3.2.2: Field Order, ผู้ส่งต้องไม่สร้างฟิลด์ส่วนหัวหลายรายการ ที่มีชื่อฟิลด์เดียวกันในข้อความ เว้นแต่ว่าค่าฟิลด์ทั้งหมดสำหรับ ฟิลด์ส่วนหัวนั้นจะกำหนดเป็นรายการที่คั่นด้วยคอมมา [เช่น #(values)] หรือฟิลด์ส่วนหัวเป็นข้อยกเว้นที่รู้จักกันดี หาก Apigee Edge พบส่วนหัวที่เฉพาะเจาะจงซึ่งไม่อนุญาตให้มี รายการที่ซ้ำกันมากกว่า 1 ครั้ง ในคำขอ HTTP ที่ไคลเอ็นต์ส่งมา ระบบจะตอบกลับด้วย 400 Bad Requestและรหัสข้อผิดพลาด protocol.http.DuplicateHeader

สาเหตุที่เป็นไปได้ของข้อผิดพลาดนี้มีดังนี้

สาเหตุ คำอธิบาย วิธีการแก้ปัญหาที่ใช้ได้กับ
ส่วนหัวที่ซ้ำกันในคำขอ คำขอ HTTP จากแอปพลิเคชันไคลเอ็นต์ไปยัง Apigee มีส่วนหัวที่ซ้ำกัน ผู้ใช้ Edge Public และ Private Cloud

ขั้นตอนการวินิจฉัยที่พบบ่อย

ใช้เครื่องมือ/เทคนิคใดเทคนิคหนึ่งต่อไปนี้เพื่อวินิจฉัยข้อผิดพลาดนี้

การตรวจสอบ API

วิธีวินิจฉัยข้อผิดพลาดโดยใช้การตรวจสอบ API

  1. ลงชื่อเข้าใช้ UI ของ Apigee Edge ในฐานะผู้ใช้ที่มี บทบาทที่เหมาะสม
  2. เปลี่ยนไปใช้องค์กรที่ต้องการตรวจสอบปัญหา

  3. ไปที่หน้า วิเคราะห์ > การตรวจสอบ API > ตรวจสอบ
  4. เลือกกรอบเวลาที่เฉพาะเจาะจงซึ่งคุณพบข้อผิดพลาด
  5. ตรวจสอบว่าได้ตั้งค่าตัวกรองพร็อกซีเป็นทั้งหมด
  6. พล็อต รหัสข้อผิดพลาด เทียบกับเวลา
  7. เลือกเซลล์ที่มีรหัสข้อผิดพลาด protocol.http.DuplicateHeader ดังที่แสดงด้านล่าง

  8. ข้อมูลเกี่ยวกับรหัสข้อผิดพลาด protocol.http.DuplicateHeader จะ แสดงดังที่แสดงด้านล่าง

  9. คลิกดูบันทึก แล้วขยายแถวสำหรับคำขอที่ไม่สำเร็จ
  10. จากหน้าต่างบันทึก ให้จดรายละเอียดต่อไปนี้
    1. รหัสสถานะ: 400
    2. แหล่งที่มาของข้อผิดพลาด: apigee
    3. รหัสข้อผิดพลาด: protocol.http.DuplicateHeader
  11. หากแหล่งที่มาของข้อผิดพลาด มีค่าเป็น apigee หรือ MP และรหัสข้อผิดพลาด มีค่าเป็น protocol.http.DuplicateHeader แสดงว่าคำขอ HTTP จาก ไคลเอ็นต์มีส่วนหัวที่ซ้ำกัน

เครื่องมือติดตาม

NGINX

วิธีวินิจฉัยข้อผิดพลาดโดยใช้บันทึกการเข้าถึง NGINX

  1. หากคุณเป็นผู้ใช้ Private Cloud คุณสามารถใช้บันทึกการเข้าถึง NGINX เพื่อดู ข้อมูลสำคัญเกี่ยวกับข้อผิดพลาด HTTP 400
  2. ตรวจสอบบันทึกการเข้าถึง NGINX

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

    โดยที่ ORG, ENV และ PORT# จะถูกแทนที่ด้วยค่าจริง

  3. ค้นหาเพื่อดูว่ามีข้อผิดพลาด 400 เกิดขึ้นในช่วงเวลาที่เฉพาะเจาะจง (หากปัญหาเกิดขึ้นในอดีต) หรือมีคำขอที่ยังคงล้มเหลวด้วยข้อผิดพลาด 400 หรือไม่
  4. หากพบข้อผิดพลาด 400 ที่มี X-Apigee-fault-code ตรงกับค่า protocol.http.DuplicateHeader ให้ กำหนดค่าของ X-Apigee-fault-source

    ตัวอย่างข้อผิดพลาด 400 จากบันทึกการเข้าถึง NGINX

    รายการตัวอย่างข้างต้นจากบันทึกการเข้าถึง NGINX มีค่าต่อไปนี้สำหรับ X-Apigee- fault-code และ X-Apigee-fault-source:

    ส่วนหัวการตอบกลับ ค่า
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source MP

สาเหตุ: ส่วนหัวที่ซ้ำกันในคำขอ

การวินิจฉัย

  1. กำหนดรหัสข้อผิดพลาด และแหล่งที่มาของข้อผิดพลาด สำหรับข้อผิดพลาดที่พบโดยใช้การตรวจสอบ API หรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ในขั้นตอนการวินิจฉัยที่พบบ่อย
  2. หากแหล่งที่มาของข้อผิดพลาด มีค่าเป็น apigee หรือ MP แสดงว่าคำขอที่แอปพลิเคชันไคลเอ็นต์ส่งไปยัง Apigee มีส่วนหัวที่ซ้ำกัน
  3. คุณสามารถกำหนดส่วนหัวจริงที่ส่งมากกว่า 1 ครั้งซึ่งเป็นส่วนหนึ่งของคำขอได้โดยใช้ วิธีใดวิธีหนึ่งต่อไปนี้

    ข้อความแสดงข้อผิดพลาด

    การใช้ข้อความแสดงข้อผิดพลาด

    1. หากคุณมีสิทธิ์เข้าถึงข้อความแสดงข้อผิดพลาดทั้งหมดที่ได้รับจาก Apigee Edge ให้ ดู faultstring faultstring มีชื่อส่วนหัวที่ส่งมากกว่า 1 ครั้ง

      ตัวอย่างข้อความแสดงข้อผิดพลาด

      "faultstring":"Duplicate Header \"Expires\""
    2. ในข้อความแสดงข้อผิดพลาดข้างต้น คุณจะเห็นว่าส่วนหัว Expires ถูก ส่งมากกว่า 1 ครั้งดังที่แสดงใน faultstring

    คำขอจริง

    การใช้คำขอจริง

    1. หากคุณมีสิทธิ์เข้าถึงคำขอจริงที่แอปพลิเคชันไคลเอ็นต์ส่ง ให้ทำตามขั้นตอนต่อไปนี้

      1. ตรวจสอบรายการส่วนหัวที่ส่งในคำขอ
      2. หากพบว่าส่วนหัวที่เฉพาะเจาะจงปรากฏมากกว่า 1 ครั้งในคำขอโดยมีค่าเดียวกันหรือค่าที่แตกต่างกัน แสดงว่าส่วนหัวนั้นเป็นสาเหตุของข้อผิดพลาดนี้

      ตัวอย่างคำขอ:

      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"
      

      ในคำขอตัวอย่างข้างต้น ส่วนหัว Expires ถูกส่งมากกว่า 1 ครั้ง ดังนั้น คำขอนี้จึงล้มเหลวโดยมีข้อผิดพลาด 400 Bad Request และรหัสข้อผิดพลาด protocol.http.DuplicateHeader

    2. หรือหากคุณมีสิทธิ์เข้าถึงบันทึกของไคลเอ็นต์ คุณจะดูได้ว่ามี ข้อมูลเกี่ยวกับคำขอจริงที่ส่งไปยัง Apigee Edge หรือไม่ และกำหนดส่วนหัวที่ ส่งมากกว่า 1 ครั้ง

ความละเอียด

แก้ไขการทำซ้ำ

ตัวเลือกที่ 1 [ตัวเลือกที่แนะนำ] แก้ไขแอปพลิเคชันไคลเอ็นต์ไม่ให้มีส่วนหัวที่ซ้ำกัน

  1. วิเคราะห์เหตุผลที่ไคลเอ็นต์ที่เฉพาะเจาะจงส่งส่วนหัวที่ซ้ำกัน เช่น Expires ในกรณีข้างต้น ตรวจสอบว่าพร็อกซี API ยอมรับ ส่วนหัวที่ซ้ำกันได้ โดยปกติแล้วจะไม่เป็นที่ต้องการตามข้อกำหนด HTTP specification RFC7230.
  2. หากไม่เป็นที่ต้องการ ให้แก้ไขแอปพลิเคชันไคลเอ็นต์ไม่ให้ส่งส่วนหัวที่ซ้ำกัน

    ในตัวอย่างที่กล่าวถึงข้างต้น พบว่าส่วนหัว Expires ถูกส่ง 2 ครั้งโดยมีค่าเดียวกัน ซึ่งไม่เป็นที่ต้องการ คุณสามารถแก้ไขปัญหาได้โดยส่งส่วนหัว Expires เพียงครั้งเดียวดังที่แสดงด้านล่าง

    curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
    
  3. หากเป็นที่ต้องการและคุณต้องการอนุญาตส่วนหัวที่ซ้ำกัน ให้ไปที่ ตัวเลือกที่ 2 การใช้พร็อพเพอร์ตี้ CwC

CwC

ตัวเลือกที่ 2 การใช้พร็อพเพอร์ตี้ CwC

Apigee มีพร็อพเพอร์ตี้ CwC HTTPHeader.<HeaderName> ซึ่งช่วยให้แอปพลิเคชันไคลเอ็นต์ และเซิร์ฟเวอร์เป้าหมายส่งส่วนหัวที่ซ้ำกันไปยังพร็อกซี API ใน Apigee Edge ได้

พร็อพเพอร์ตี้ CwC ค่า
HTTPHeader.<HeaderName> allowDuplicates,multivalued

ตัวอย่างเช่น คุณตั้งค่าพร็อพเพอร์ตี้ต่อไปนี้ใน Message Processor เพื่ออนุญาตให้มีรายการที่ซ้ำกันและ ค่าหลายค่าสำหรับส่วนหัว Expires ได้

HTTPHeader.Expires=allowDuplicates, multiValued
  1. หากคุณเป็น ผู้ใช้ Private Cloud คุณสามารถกำหนดค่าพร็อพเพอร์ตี้เพื่อป้องกันไม่ให้ Apigee Edge แสดงข้อผิดพลาด 400 Bad Request แม้ว่าคำขอจะมี ส่วนหัวที่ซ้ำกัน โดยใช้คู่มือวิธีการ กำหนดค่า Message Processor ให้ใช้ส่วนหัวที่ซ้ำกัน
  2. หากคุณเป็นผู้ใช้ Public Cloud โปรดติดต่อทีมสนับสนุนของ Apigee Edge เพื่อกำหนดค่าพร็อพเพอร์ตี้นี้ สำหรับองค์กรของคุณ

ข้อมูลจำเพาะ

Apigee คาดหวังว่าแอปพลิเคชันไคลเอ็นต์จะไม่ส่งส่วนหัวที่ซ้ำกันซึ่งเป็นส่วนหนึ่งของคำขอ ตามข้อกำหนด RFC ต่อไปนี้

ข้อมูลจำเพาะ
RFC 7230 ส่วนที่ 3.2.2: Field Order
RFC 7230 ส่วนที่ 3.2 ส่วนหัว

หากยังต้องการความช่วยเหลือจากทีมสนับสนุนของ Apigee โปรดไปที่ ข้อมูลการวินิจฉัยที่ต้องรวบรวม

ข้อมูลการวินิจฉัยที่ต้องรวบรวม

รวบรวมข้อมูลการวินิจฉัยต่อไปนี้ แล้วติดต่อทีมสนับสนุนของ Apigee Edge

หากคุณเป็นผู้ใช้ Public Cloud โปรดระบุข้อมูลต่อไปนี้

  • ชื่อองค์กร
  • ชื่อสภาพแวดล้อม
  • ชื่อพร็อกซี API
  • คำสั่ง curl ที่สมบูรณ์ซึ่งใช้ในการจำลองข้อผิดพลาด 400
  • ไฟล์ติดตามสำหรับคำขอ API

หากคุณเป็นผู้ใช้ Private Cloud โปรดระบุข้อมูลต่อไปนี้

  • ข้อความแสดงข้อผิดพลาดทั้งหมดที่พบสำหรับคำขอที่ไม่สำเร็จ
  • ชื่อสภาพแวดล้อม
  • App Bundle ของพร็อกซี API
  • คำสั่ง curl ที่สมบูรณ์ซึ่งคุณใช้ในการจำลองข้อผิดพลาด 400
  • ไฟล์ติดตามสำหรับคำขอ API
  • บันทึกการเข้าถึง NGINX

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

    โดยที่ ORG, ENV และ PORT# จะถูกแทนที่ด้วย ค่าจริง

  • บันทึกของระบบ Message Processor /opt/apigee/var/log/edge-message-processor/logs/system.log