คุณกำลังดูเอกสารประกอบของ 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: ลำดับช่อง ผู้ส่งต้องไม่สร้างช่องส่วนหัวหลายช่องโดยใช้ชื่อช่องเดียวกันในข้อความ เว้นแต่ว่าค่าในช่องส่วนหัวทั้งหมดจะถูกกำหนดเป็นรายการที่คั่นด้วยเครื่องหมายจุลภาค [เช่น #(values)] หรือช่องส่วนหัวเป็นข้อยกเว้นที่ทราบกันดี หาก Apigee Edge พบส่วนหัวที่เจาะจงซึ่งระบบไม่อนุญาตให้ซ้ำกัน โดยไคลเอ็นต์จะตอบกลับด้วย 400 Bad Request
และรหัสข้อผิดพลาด protocol.http.DuplicateHeader
มากกว่า 1 ครั้งในคำขอ HTTP
สาเหตุที่เป็นไปได้ของข้อผิดพลาดนี้มีดังนี้
สาเหตุ | คำอธิบาย | วิธีการแก้ปัญหาที่ใช้กับ |
---|---|---|
มีส่วนหัวซ้ำในคำขอ | คำขอ HTTP จากแอปพลิเคชันไคลเอ็นต์ที่ส่งไปยัง Apigee มีส่วนหัวซ้ำกัน | ผู้ใช้ Edge Public และ Private Cloud |
ขั้นตอนการวินิจฉัยทั่วไป
ใช้เครื่องมือ/เทคนิคอย่างใดอย่างหนึ่งต่อไปนี้เพื่อวิเคราะห์ข้อผิดพลาดนี้
การตรวจสอบ API
วิธีวินิจฉัยข้อผิดพลาดโดยใช้ API Monitoring
- ลงชื่อเข้าใช้ UI ของ Apigee Edge ในฐานะผู้ใช้ที่มีบทบาทที่เหมาะสม
เปลี่ยนเป็นองค์กรที่คุณต้องการตรวจสอบปัญหา
- ไปที่หน้าวิเคราะห์ > การตรวจสอบ API > ตรวจสอบ
- เลือกกรอบเวลาเฉพาะที่คุณพบข้อผิดพลาด
- ตรวจสอบว่าตั้งค่าตัวกรองพร็อกซีเป็นทั้งหมด
- พล็อตโค้ดข้อผิดพลาดเทียบกับเวลา
เลือกเซลล์ที่มีรหัสข้อผิดพลาด
protocol.http.DuplicateHeader
ดังที่แสดงด้านล่างข้อมูลเกี่ยวกับรหัสข้อผิดพลาด
protocol.http.DuplicateHeader
จะแสดงอยู่ดังที่แสดงด้านล่าง- คลิกดูบันทึกแล้วขยายแถวสําหรับคําขอที่ล้มเหลว
- ดูรายละเอียดต่อไปนี้จากหน้าต่าง Logs
- รหัสสถานะ:
400
- แหล่งที่มาของข้อผิดพลาด:
apigee
- Fault Code:
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.DuplicateHeader
X-Apigee-fault-source MP
สาเหตุ: ส่วนหัวในคำขอซ้ำกัน
การวินิจฉัย
- ระบุ Fault Code และ Fault Source สำหรับข้อผิดพลาดที่พบโดยใช้ API Monitoring หรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ในขั้นตอนการวินิจฉัยทั่วไป
- หาก Fault Source มีค่า
apigee
หรือMP
แสดงว่าคำขอที่ส่งโดยแอปพลิเคชันไคลเอ็นต์ไปยัง Apigee นั้นมีส่วนหัวที่ซ้ำกัน คุณระบุส่วนหัวจริงที่ส่งมากกว่า 1 ครั้งโดยเป็นส่วนหนึ่งของคำขอได้โดยใช้วิธีใดวิธีหนึ่งต่อไปนี้
ข้อความแสดงข้อผิดพลาด
การใช้ข้อความแสดงข้อผิดพลาด
หากคุณมีสิทธิ์เข้าถึงข้อความแสดงข้อผิดพลาดทั้งหมดที่ได้รับจาก Apigee Edge โปรดดู
faultstring
faultstring
มีชื่อส่วนหัวที่มีการส่งมากกว่า 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 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 |
เช่น สามารถตั้งค่าพร็อพเพอร์ตี้ต่อไปนี้ในตัวประมวลผลข้อความเพื่ออนุญาตรายการซ้ำ และมีค่าหลายค่าสำหรับส่วนหัว Expires
HTTPHeader.Expires=allowDuplicates, multiValued
- หากคุณเป็นผู้ใช้ Private Cloud คุณจะกำหนดค่าพร็อพเพอร์ตี้เพื่อป้องกันไม่ให้ Apigee Edge มีข้อผิดพลาด
400 Bad Request
ได้แม้ว่าคำขอจะมีส่วนหัวซ้ำกันโดยใช้คำแนะนำวิธีใช้ การกำหนดค่าตัวประมวลผลข้อความเพื่อใช้ส่วนหัวที่ซ้ำกัน - หากคุณเป็นผู้ใช้ Cloud สาธารณะ โปรดติดต่อทีมสนับสนุนของ 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