คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่
เอกสารประกอบของ Apigee X info
ลักษณะปัญหา
แอปพลิเคชันไคลเอ็นต์ได้รับการตอบกลับ HTTP 400 Bad Request พร้อมข้อความ
The plain HTTP request was sent to HTTPS port
ข้อความแสดงข้อผิดพลาด
แอปพลิเคชันไคลเอ็นต์ได้รับโค้ดตอบกลับต่อไปนี้
HTTP/1.1 400 Bad Request
ตามด้วยหน้าข้อผิดพลาด HTML ด้านล่าง
<html> <head><title>400 The plain HTTP request was sent to HTTPS port</title></head> <body> <center><h1>400 Bad Request</h1></center> <center>The plain HTTP request was sent to HTTPS port</center> </body> </html>
สาเหตุที่เป็นไปได้
| สาเหตุ | คำอธิบาย | วิธีการแก้ปัญหาที่ใช้ได้กับ |
|---|---|---|
| คำขอ HTTP ไปยังโฮสต์เสมือนที่กำหนดค่า TLS | ไคลเอ็นต์ส่งคำขอ HTTP ไปยังโฮสต์เสมือนที่กำหนดค่า TLS | ผู้ใช้ Edge Public และ Private Cloud |
| คำขอ HTTP ไปยังปลายทางเป้าหมายที่กำหนดค่า TLS | คำขอ HTTP ที่ส่งไปยังเซิร์ฟเวอร์แบ็กเอนด์ที่เปิดใช้ TLS ในปลายทางเป้าหมาย | ผู้ใช้ Edge Public และ Private Cloud |
| การกำหนดค่าเซิร์ฟเวอร์เป้าหมายไม่ถูกต้อง | เซิร์ฟเวอร์เป้าหมายได้รับการกำหนดค่าด้วยพอร์ตที่ปลอดภัย 443 แต่ไม่ได้เปิดใช้ SSL |
ผู้ใช้ Edge Public และ Private Cloud |
สาเหตุ: คำขอ HTTP ไปยังโฮสต์เสมือนที่กำหนดค่า TLS
ข้อผิดพลาดนี้เกิดขึ้นเมื่อไคลเอ็นต์พยายามเชื่อมต่อกับ API ใน Apigee และโฮสต์เสมือนที่กล่าวถึง ได้รับการกำหนดค่าให้ใช้ SSL แต่ได้รับคำขอ HTTP แทน
การวินิจฉัย
เนื่องจากปัญหานี้เกิดขึ้นที่ปลายทาง Northbound และคำขอ API ล้มเหลวที่จุดเริ่มต้นของการโต้ตอบระหว่าง แอปพลิเคชันไคลเอ็นต์กับเราเตอร์ ระบบจึงไม่บันทึกข้อความแสดงข้อผิดพลาดเหล่านี้ในบันทึกการเข้าถึง เราเตอร์ NGINX ดังนั้น ระบบจะไม่บันทึกคำขอเหล่านี้ในเครื่องมือต่างๆ เช่น API Monitoring และ เครื่องมือ Trace
-
ตรวจสอบคำขอ API และดูว่าคุณส่งคำขอ HTTP สำหรับนามแฝงโฮสต์ที่ กำหนดค่าให้ยอมรับคำขอในพอร์ตที่ปลอดภัย
443เท่านั้นหรือไม่ หากใช่ แสดงว่านั่นคือสาเหตุของปัญหาตัวอย่างคำขอ API ที่ไม่ถูกต้อง
curl http://org-test.apigee.net:443/400-demo
<html> <head><title>400 The plain HTTP request was sent to HTTPS port</title></head> <body> <center><h1>400 Bad Request</h1></center> <center>The plain HTTP request was sent to HTTPS port</center> <hr><center>server</center> </body> </html>
- ในคำขอตัวอย่างข้างต้น โปรดทราบว่ามีการส่งคำขอ HTTP ไปยังนามแฝงโฮสต์
myorg-test.apigee.netในพอร์ตที่ปลอดภัย443ซึ่งเป็นสาเหตุของข้อผิดพลาด400 Bad Request
ความละเอียด
คุณต้องตรวจสอบว่าไคลเอ็นต์ใช้ HTTP แทน HTTPS หรือไม่ และส่งคำขอที่ถูกต้องดังที่ แสดงด้านล่าง:
ตัวอย่างคำขอ API
curl https://org-test.apigee.net:443/400-demo
หรือ
curl https://org-test.apigee.net/400-demo
< HTTP/1.1 200 OK < Date: Thu, 25 Feb 2021 13:01:43 GMT < Content-Type: text/xml;charset=UTF-8 < Content-Length: 403 < Connection: keep-alive < Server: gunicorn/19.9.0 < Access-Control-Allow-Origin: * < Access-Control-Allow-Credentials: true
สาเหตุ: คำขอ HTTP ไปยังปลายทางเป้าหมายที่กำหนดค่า TLS
ข้อผิดพลาดนี้เกิดขึ้นหากคุณกำหนดค่าคำขอ HTTP ไปยังเซิร์ฟเวอร์แบ็กเอนด์ที่เปิดใช้ TLS ในปลายทางเป้าหมายของพร็อกซี API ไม่ถูกต้อง
การวินิจฉัย
ทำตามขั้นตอนต่อไปนี้เพื่อวินิจฉัยข้อผิดพลาดโดยใช้เครื่องมือ Trace
- เปิดใช้Trace ใน UI ของ Apigee สำหรับพร็อกซี API ที่ได้รับผลกระทบ
- ส่งคำขอไปยังพร็อกซี API
- เลือกคำขอ API รายการใดรายการหนึ่งที่ล้มเหลวโดยมีโค้ดตอบกลับ
400 - ดูขั้นตอนต่างๆ และระบุว่าข้อผิดพลาดเกิดขึ้นที่ใด
-
โดยปกติคุณจะเห็นการตอบกลับข้อผิดพลาด
400จากเซิร์ฟเวอร์แบ็กเอนด์ นั่นคือ คุณจะเห็นการตอบกลับข้อผิดพลาด400ในขั้นตอนการตอบกลับที่ได้รับ จากเซิร์ฟเวอร์เป้าหมาย ดังที่แสดงด้านล่าง
-
ระบุปลายทางเป้าหมายที่ส่งคำขอโดยคลิกไอคอน AX (บันทึกข้อมูลการวิเคราะห์) ใน Trace

- จดบันทึก target.url ซึ่งมีโปรโตคอล นามแฝงโฮสต์ของเซิร์ฟเวอร์แบ็กเอนด์
และบางครั้งก็มีหมายเลขพอร์ต พอร์ตที่ใช้สำหรับ
URL เป้าหมายคือ
443แต่โปรโตคอลคือ HTTP - ตรวจสอบคำจำกัดความของปลายทางเป้าหมายเพื่อทำความเข้าใจการกำหนดค่า
-
ตรวจสอบว่าโฮสต์ของเซิร์ฟเวอร์แบ็กเอนด์ปลอดภัยและรับฟังในพอร์ตที่ปลอดภัย เช่น
443หากคุณใช้โปรโตคอลเป็นhttpในองค์ประกอบ<URL>แสดงว่านั่นคือสาเหตุของปัญหานี้ตัวอย่างการกำหนดค่าปลายทางเป้าหมาย
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <TargetEndpoint name="default"> <Description/> <FaultRules/> <PreFlow name="PreFlow"> <Request/> <Response/> </PreFlow> <PostFlow name="PostFlow"> <Request/> <Response/> </PostFlow> <Flows/> <HTTPTargetConnection> <Properties/> <URL>http://somehost.org:443/get</URL> </HTTPTargetConnection> </TargetEndpoint>ตัวอย่างข้างต้นแสดงว่าคุณใช้โปรโตคอล HTTP แต่พอร์ตที่ใช้คือพอร์ตที่ปลอดภัย พอร์ต
443ซึ่งทำให้เซิร์ฟเวอร์แบ็กเอนด์ตอบกลับด้วย400 Bad Requestและข้อความแสดงข้อผิดพลาดThe plain HTTP request was sent to HTTPS port
ความละเอียด
-
หากเซิร์ฟเวอร์แบ็กเอนด์ของคุณปลอดภัย/เปิดใช้ TLS แล้ว ให้ตรวจสอบว่าคุณใช้โปรโตคอลเป็น
httpsในองค์ประกอบ<URL>ของปลายทางเป้าหมาย ดังที่แสดงใน ตัวอย่างต่อไปนี้ตัวอย่างการกำหนดค่าปลายทางเป้าหมาย
<HTTPTargetConnection> <Properties/> <URL>https://somehost.org:443/get</URL> </HTTPTargetConnection> -
หากเซิร์ฟเวอร์แบ็กเอนด์ของคุณ ไม่ปลอดภัย ให้ทำดังนี้
- อย่าระบุหมายเลขพอร์ตที่ปลอดภัย เช่น
443 - คุณไม่จำเป็นต้องระบุหมายเลขพอร์ตเลย หากเซิร์ฟเวอร์แบ็กเอนด์รับฟังใน พอร์ตที่ไม่ปลอดภัยมาตรฐาน
- ระบุหมายเลขพอร์ตหากคุณใช้พอร์ตที่ไม่ปลอดภัยอื่นๆ เช่น
9080
ตัวอย่างการกำหนดค่าปลายทางเป้าหมาย
<HTTPTargetConnection> <Properties/> <URL>http://somehost.org/get</URL> </HTTPTargetConnection> or <HTTPTargetConnection> <Properties/> <URL>http://somehost.org:9080/get</URL> </HTTPTargetConnection> - อย่าระบุหมายเลขพอร์ตที่ปลอดภัย เช่น
สาเหตุ: การกำหนดค่าเซิร์ฟเวอร์เป้าหมายไม่ถูกต้อง
หากเซิร์ฟเวอร์เป้าหมายได้รับการกำหนดค่าด้วยพอร์ตที่ปลอดภัย เช่น 443 โดยไม่ได้เปิดใช้ SSL จะทำให้ Message Processor ของ Apigee Edge ส่งคำขอ HTTP ไปยังเซิร์ฟเวอร์เป้าหมายที่ปลอดภัยหรือกำหนดค่า TLS ซึ่งนำไปสู่ปัญหานี้
การวินิจฉัย
ทำตามขั้นตอนต่อไปนี้เพื่อวินิจฉัยข้อผิดพลาดโดยใช้เครื่องมือ Trace
- เปิดใช้Trace ใน UI ของ Apigee สำหรับพร็อกซี API ที่ได้รับผลกระทบ
- ส่งคำขอไปยังพร็อกซี API
- เลือกคำขอ API รายการใดรายการหนึ่งที่ล้มเหลวโดยมีโค้ดตอบกลับ
400 - ดูขั้นตอนต่างๆ และระบุว่าข้อผิดพลาดเกิดขึ้นที่ใด
-
โดยปกติคุณจะเห็นการตอบกลับข้อผิดพลาด
400จากเซิร์ฟเวอร์แบ็กเอนด์ นั่นคือ คุณจะเห็นการตอบกลับข้อผิดพลาด400ในขั้นตอนการตอบกลับที่ได้รับ จากเซิร์ฟเวอร์เป้าหมาย ดังที่แสดงด้านล่าง
-
ระบุปลายทางเป้าหมายที่ส่งคำขอโดยคลิกไอคอน AX (บันทึกข้อมูลการวิเคราะห์) ใน Trace

-
จดบันทึก target.name ซึ่งแสดงถึงชื่อปลายทางเป้าหมาย
ในไฟล์ Trace ตัวอย่างข้างต้น target.name คือ default ซึ่งบ่งบอกว่า ปลายทางเป้าหมายที่ใช้สำหรับคำขอนี้คือค่าเริ่มต้น
-
ตรวจสอบคำจำกัดความของปลายทางเป้าหมายเพื่อทำความเข้าใจการกำหนดค่า
ตัวอย่างการกำหนดค่าปลายทางเป้าหมาย
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <TargetEndpoint name="default"> <Description/> <FaultRules/> <PreFlow name="PreFlow"> <Request/> <Response/> </PreFlow> <PostFlow name="PostFlow"> <Request/> <Response/> </PostFlow> <Flows/> <HTTPTargetConnection> <Properties/> <LoadBalancer> <Server name="faulty-target"/> </LoadBalancer> </HTTPTargetConnection> </TargetEndpoint>การกำหนดค่าปลายทางเป้าหมายตัวอย่างข้างต้นแสดงว่าคุณใช้เซิร์ฟเวอร์เป้าหมาย ชื่อ
faulty-target -
เมื่อได้ชื่อเซิร์ฟเวอร์เป้าหมายแล้ว คุณจะใช้วิธีใดวิธีหนึ่งต่อไปนี้เพื่อ ตรวจสอบการกำหนดค่าเซิร์ฟเวอร์เป้าหมายได้
- UI ของ Edge
- Management API
UI ของ Edge
- ไปที่ Apigee Edge > ผู้ดูแลระบบ > สภาพแวดล้อม > เซิร์ฟเวอร์เป้าหมาย
- เลือกเซิร์ฟเวอร์เป้าหมายที่ระบุจากพร็อกซี API แล้วคลิก แก้ไข
- ตรวจสอบพอร์ตที่ระบุสำหรับเซิร์ฟเวอร์เป้าหมายและข้อมูล SSL
-
หากเซิร์ฟเวอร์เป้าหมายได้รับการกำหนดค่าด้วยพอร์ตที่ปลอดภัย (เช่น
443) แต่ไม่ได้เปิดใช้ SSL แสดงว่านั่นคือสาเหตุของปัญหานี้
ดังที่เห็นในภาพหน้าจอด้านบน พอร์ตที่ใช้คือ
443แต่ไม่ได้เปิดใช้ SSL สำหรับพอร์ตนั้นในการกำหนดค่าเซิร์ฟเวอร์เป้าหมาย ซึ่งทำให้ตัวประมวลผลข้อความของ Apigee Edge ส่งคำขอ HTTP ไปยังพอร์ตที่ปลอดภัย443ดังนั้น คุณจึงได้รับ ข้อผิดพลาด400 Bad Requestพร้อมข้อความThe plain HTTP request was sent to HTTPS port
Management API
-
เรียกใช้ Get target server API เพื่อรับรายละเอียดเกี่ยวกับการกำหนดค่าเซิร์ฟเวอร์เป้าหมายที่เฉพาะเจาะจง ดังที่แสดงด้านล่าง
ผู้ใช้ Public Cloud:
curl -v 'https://api.enterprise.apigee.com/v1/organizations/ORG_NAME/environments/ENV_NAME>/targetservers/TARGET_SERVER_NAME' \ -H "Content-Type:application/xml" \ -H "Authorization:Bearer $TOKEN"
ผู้ใช้ Private Cloud:
curl -v 'http://MANAGEMENT_IP:8080/v1/organizations/ORG_NAME/environments/ENV_NAME/targetservers/TARGET_SERVER_NAME' \ -H "Content-Type:application/xml" \ -H "Authorization:Bearer $TOKEN"
- ตรวจสอบพอร์ตที่ระบุสำหรับเซิร์ฟเวอร์เป้าหมายและข้อมูล SSL
-
หากเซิร์ฟเวอร์เป้าหมายได้รับการกำหนดค่าด้วยพอร์ตที่ปลอดภัย (เช่น
443) แต่ ไม่ได้กำหนดหรือเปิดใช้ส่วนSSLInfoแสดงว่านั่นคือสาเหตุสำหรับ ปัญหานี้ตัวอย่างการกำหนดค่าเซิร์ฟเวอร์เป้าหมาย
{ "host" : "somehost.org", "isEnabled" : true, "name" : "faulty-target", "port" : 443 }ในเอาต์พุตตัวอย่างข้างต้น เราจะเห็นว่าพอร์ตที่ใช้สำหรับการเชื่อมต่อเป้าหมายคือ
443แต่ไม่มีบล็อกการกำหนดค่าSSLInfoซึ่งทำให้ Message Processor ของ Apigee Edge ส่งคำขอ HTTP ไปยังพอร์ตที่ปลอดภัย
443ดังนั้น คุณจึงได้รับข้อผิดพลาด400 Bad Requestพร้อมข้อความThe plain HTTP request was sent to HTTPS port
ความละเอียด
หากเซิร์ฟเวอร์เป้าหมายของคุณปลอดภัยหรือกำหนดค่า TLS แล้ว คุณต้องเปิดใช้ SSL สำหรับเซิร์ฟเวอร์เป้าหมายที่เฉพาะเจาะจง
คุณทำได้โดยใช้ตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้
- UI ของ Edge
- Management API
UI ของ Edge
- ไปที่เซิร์ฟเวอร์เป้าหมายใน UI ของ Edge > ผู้ดูแลระบบ > สภาพแวดล้อม > เซิร์ฟเวอร์เป้าหมาย
- เลือกเซิร์ฟเวอร์เป้าหมายที่เฉพาะเจาะจง แล้วคลิก แก้ไข
- หากเซิร์ฟเวอร์เป้าหมายของคุณปลอดภัยและใช้พอร์ต เช่น
443ให้เปิดใช้ SSL โดย เลือกช่องทำเครื่องหมายข้างตัวเลือก SSL - กำหนดค่า Truststore, Ciphers และ Protocols (เฉพาะในกรณีที่จำเป็น)
Management API
ใช้ Management API เพื่อกำหนดค่าเซิร์ฟเวอร์เป้าหมายตามที่อธิบายไว้ใน เอกสารประกอบเรื่องการกำหนดค่าเซิร์ฟเวอร์เป้าหมาย
ข้อมูลการวินิจฉัยที่ต้องรวบรวม
หากยังพบปัญหาอยู่แม้จะทำตามวิธีการข้างต้นแล้ว ให้รวบรวมข้อมูลการวินิจฉัยต่อไปนี้ แล้วติดต่อทีมสนับสนุนของ Apigee Edge
- หากคุณเป็นผู้ใช้ Public Cloud โปรดระบุข้อมูลต่อไปนี้
- ชื่อองค์กร
- ชื่อสภาพแวดล้อม
- ชื่อพร็อกซี API
- คำสั่ง curl ที่สมบูรณ์เพื่อจำลองข้อผิดพลาด
- เอาต์พุตของเครื่องมือ Trace (หากคุณบันทึกคำขอที่ล้มเหลวได้)
- หากคุณเป็นผู้ใช้ Private Cloud โปรดระบุข้อมูลต่อไปนี้
- ข้อความแสดงข้อผิดพลาดทั้งหมดที่พบ
- ชื่อสภาพแวดล้อม
- แพ็กเกจพร็อกซี API
- คำจำกัดความของเซิร์ฟเวอร์เป้าหมาย (หากคุณใช้เซิร์ฟเวอร์เป้าหมายในปลายทาง)
- เอาต์พุตของเครื่องมือ Trace (หากคุณบันทึกคำขอที่ล้มเหลวได้)