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

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

ลักษณะปัญหา

แอปพลิเคชันไคลเอ็นต์ได้รับรหัสสถานะ 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: ลำดับช่อง ผู้ส่งต้องไม่สร้างส่วนหัวหลายรายการ ฟิลด์ที่มีชื่อฟิลด์เหมือนกันในข้อความ ยกเว้นฟิลด์ที่เป็นค่าทั้งหมด ช่องส่วนหัวถูกกำหนดเป็นรายการที่คั่นด้วยจุลภาค [เช่น #(ค่า)] หรือฟิลด์ส่วนหัวคือ ข้อยกเว้นที่ทราบกันดี หาก Apigee Edge พบส่วนหัวที่เฉพาะเจาะจง ส่วนหัวดังกล่าวไม่ได้รับอนุญาตให้ใช้ ซ้ำกัน มากกว่า 1 ครั้งในคำขอ HTTP ที่ไคลเอ็นต์ส่ง จากนั้น ตอบกลับด้วย 400 Bad Request และรหัสข้อผิดพลาด protocol.http.DuplicateHeader

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

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

ขั้นตอนการวินิจฉัยทั่วไป

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

การตรวจสอบ API

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

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

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

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

  9. คลิก ดูบันทึก และขยายแถวสำหรับคำขอที่ล้มเหลว
  10. จากหน้าต่าง Logs ให้จดรายละเอียดต่อไปนี้
    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 มี มีการส่งชื่อส่วนหัวมากกว่าหนึ่งครั้ง

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

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

    คำขอจริง

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

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

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

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

      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 ส่งมากกว่า ครั้งเดียว ดังนั้นคำขอนี้จึงล้มเหลวโดยมีข้อผิดพลาด 400 Bad Request และ รหัสข้อผิดพลาด: protocol.http.DuplicateHeader

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

ความละเอียด

แก้ไขความซ้ำซ้อน

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

  1. วิเคราะห์สาเหตุที่ลูกค้าที่เฉพาะเจาะจงส่งส่วนหัวซ้ำ ตัวอย่างเช่น Expires ในกรณีข้างต้น ยืนยันว่าพร็อกซี API ยอมรับได้ ส่วนหัวซ้ำกัน โดยทั่วไปไฟล์จะไม่เป็นที่ต้องการตามข้อมูลจำเพาะของ HTTP 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

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

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

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

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

ข้อมูลจำเพาะ
RFC 7230 ส่วนที่ 3.2.2: ลำดับในช่อง
RFC 7230 ส่วนที่ 3.2 ช่องส่วนหัว

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

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

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

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

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

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

  • พบข้อความแสดงข้อผิดพลาดทั้งหมดสำหรับคำขอที่ล้มเหลว
  • ชื่อสภาพแวดล้อม
  • แพ็กเกจพร็อกซี API
  • ทำตามคำสั่ง curl ที่คุณใช้เพื่อสร้างข้อผิดพลาด 400 ซ้ำ
  • ไฟล์การติดตามสำหรับคำขอ API
  • บันทึกการเข้าถึง 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