คุณกำลังดูเอกสารประกอบของ 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
- ลงชื่อเข้าใช้ UI ของ Apigee Edge ในฐานะผู้ใช้ที่มี บทบาทที่เหมาะสม
เปลี่ยนไปใช้องค์กรที่ต้องการตรวจสอบปัญหา

- ไปที่หน้า วิเคราะห์ > การตรวจสอบ API > ตรวจสอบ
- เลือกกรอบเวลาที่เฉพาะเจาะจงซึ่งคุณพบข้อผิดพลาด
- ตรวจสอบว่าได้ตั้งค่าตัวกรองพร็อกซีเป็นทั้งหมด
- พล็อต รหัสข้อผิดพลาด เทียบกับเวลา
เลือกเซลล์ที่มีรหัสข้อผิดพลาด
protocol.http.DuplicateHeaderดังที่แสดงด้านล่าง
ข้อมูลเกี่ยวกับรหัสข้อผิดพลาด
protocol.http.DuplicateHeaderจะ แสดงดังที่แสดงด้านล่าง
- คลิกดูบันทึก แล้วขยายแถวสำหรับคำขอที่ไม่สำเร็จ
- จากหน้าต่างบันทึก ให้จดรายละเอียดต่อไปนี้
- รหัสสถานะ:
400 - แหล่งที่มาของข้อผิดพลาด:
apigee - รหัสข้อผิดพลาด:
protocol.http.DuplicateHeader
- รหัสสถานะ:
- หากแหล่งที่มาของข้อผิดพลาด มีค่าเป็น
apigeeหรือMPและรหัสข้อผิดพลาด มีค่าเป็นprotocol.http.DuplicateHeaderแสดงว่าคำขอ HTTP จาก ไคลเอ็นต์มีส่วนหัวที่ซ้ำกัน
เครื่องมือติดตาม
NGINX
วิธีวินิจฉัยข้อผิดพลาดโดยใช้บันทึกการเข้าถึง NGINX
- หากคุณเป็นผู้ใช้ Private Cloud คุณสามารถใช้บันทึกการเข้าถึง NGINX เพื่อดู
ข้อมูลสำคัญเกี่ยวกับข้อผิดพลาด HTTP
400 ตรวจสอบบันทึกการเข้าถึง NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logโดยที่ ORG, ENV และ PORT# จะถูกแทนที่ด้วยค่าจริง
- ค้นหาเพื่อดูว่ามีข้อผิดพลาด
400เกิดขึ้นในช่วงเวลาที่เฉพาะเจาะจง (หากปัญหาเกิดขึ้นในอดีต) หรือมีคำขอที่ยังคงล้มเหลวด้วยข้อผิดพลาด400หรือไม่ หากพบข้อผิดพลาด
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.DuplicateHeaderX-Apigee-fault-source MP
สาเหตุ: ส่วนหัวที่ซ้ำกันในคำขอ
การวินิจฉัย
- กำหนดรหัสข้อผิดพลาด และแหล่งที่มาของข้อผิดพลาด สำหรับข้อผิดพลาดที่พบโดยใช้การตรวจสอบ API หรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ในขั้นตอนการวินิจฉัยที่พบบ่อย
- หากแหล่งที่มาของข้อผิดพลาด มีค่าเป็น
apigeeหรือMPแสดงว่าคำขอที่แอปพลิเคชันไคลเอ็นต์ส่งไปยัง Apigee มีส่วนหัวที่ซ้ำกัน คุณสามารถกำหนดส่วนหัวจริงที่ส่งมากกว่า 1 ครั้งซึ่งเป็นส่วนหนึ่งของคำขอได้โดยใช้ วิธีใดวิธีหนึ่งต่อไปนี้
ข้อความแสดงข้อผิดพลาด
การใช้ข้อความแสดงข้อผิดพลาด
หากคุณมีสิทธิ์เข้าถึงข้อความแสดงข้อผิดพลาดทั้งหมดที่ได้รับจาก Apigee Edge ให้ ดู
faultstringfaultstringมีชื่อส่วนหัวที่ส่งมากกว่า 1 ครั้งตัวอย่างข้อความแสดงข้อผิดพลาด
"faultstring":"Duplicate Header \"Expires\""
- ในข้อความแสดงข้อผิดพลาดข้างต้น คุณจะเห็นว่าส่วนหัว
Expiresถูก ส่งมากกว่า 1 ครั้งดังที่แสดงในfaultstring
คำขอจริง
การใช้คำขอจริง
หากคุณมีสิทธิ์เข้าถึงคำขอจริงที่แอปพลิเคชันไคลเอ็นต์ส่ง ให้ทำตามขั้นตอนต่อไปนี้
- ตรวจสอบรายการส่วนหัวที่ส่งในคำขอ
- หากพบว่าส่วนหัวที่เฉพาะเจาะจงปรากฏมากกว่า 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- หรือหากคุณมีสิทธิ์เข้าถึงบันทึกของไคลเอ็นต์ คุณจะดูได้ว่ามี ข้อมูลเกี่ยวกับคำขอจริงที่ส่งไปยัง Apigee Edge หรือไม่ และกำหนดส่วนหัวที่ ส่งมากกว่า 1 ครั้ง
ความละเอียด
แก้ไขการทำซ้ำ
ตัวเลือกที่ 1 [ตัวเลือกที่แนะนำ] แก้ไขแอปพลิเคชันไคลเอ็นต์ไม่ให้มีส่วนหัวที่ซ้ำกัน
- วิเคราะห์เหตุผลที่ไคลเอ็นต์ที่เฉพาะเจาะจงส่งส่วนหัวที่ซ้ำกัน เช่น
Expiresในกรณีข้างต้น ตรวจสอบว่าพร็อกซี API ยอมรับ ส่วนหัวที่ซ้ำกันได้ โดยปกติแล้วจะไม่เป็นที่ต้องการตามข้อกำหนด HTTP specification RFC7230. - หากไม่เป็นที่ต้องการ ให้แก้ไขแอปพลิเคชันไคลเอ็นต์ไม่ให้ส่งส่วนหัวที่ซ้ำกัน
ในตัวอย่างที่กล่าวถึงข้างต้น พบว่าส่วนหัว
Expiresถูกส่ง 2 ครั้งโดยมีค่าเดียวกัน ซึ่งไม่เป็นที่ต้องการ คุณสามารถแก้ไขปัญหาได้โดยส่งส่วนหัวExpiresเพียงครั้งเดียวดังที่แสดงด้านล่างcurl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
- หากเป็นที่ต้องการและคุณต้องการอนุญาตส่วนหัวที่ซ้ำกัน ให้ไปที่ ตัวเลือกที่ 2 การใช้พร็อพเพอร์ตี้ CwC
CwC
ตัวเลือกที่ 2 การใช้พร็อพเพอร์ตี้ CwC
Apigee มีพร็อพเพอร์ตี้
CwC HTTPHeader.<HeaderName> ซึ่งช่วยให้แอปพลิเคชันไคลเอ็นต์
และเซิร์ฟเวอร์เป้าหมายส่งส่วนหัวที่ซ้ำกันไปยังพร็อกซี API ใน Apigee Edge ได้
| พร็อพเพอร์ตี้ CwC | ค่า |
|---|---|
HTTPHeader.<HeaderName> |
allowDuplicates,multivalued |
ตัวอย่างเช่น คุณตั้งค่าพร็อพเพอร์ตี้ต่อไปนี้ใน Message Processor เพื่ออนุญาตให้มีรายการที่ซ้ำกันและ
ค่าหลายค่าสำหรับส่วนหัว Expires ได้
HTTPHeader.Expires=allowDuplicates, multiValued
- หากคุณเป็น ผู้ใช้ Private Cloud คุณสามารถกำหนดค่าพร็อพเพอร์ตี้เพื่อป้องกันไม่ให้
Apigee Edge แสดงข้อผิดพลาด
400 Bad Requestแม้ว่าคำขอจะมี ส่วนหัวที่ซ้ำกัน โดยใช้คู่มือวิธีการ กำหนดค่า Message Processor ให้ใช้ส่วนหัวที่ซ้ำกัน - หากคุณเป็นผู้ใช้ 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