شما در حال مشاهده اسناد Apigee Edge هستید.
به مستندات Apigee X بروید . اطلاعات
علامت
برنامه مشتری یک پاسخ 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 از HTTP استفاده می کند یا خیر و درخواست صحیح را مطابق شکل زیر انجام دهید:
نمونه درخواست 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 را در رابط کاربری Apigee برای پروکسی API آسیب دیده فعال کنید.
- به پروکسی API درخواست دهید.
- یکی از درخواست های API که با کد پاسخ
400ناموفق بود را انتخاب کنید. - در مراحل مختلف پیمایش کنید و تعیین کنید که در کجا شکست رخ داده است.
معمولاً پاسخ خطای
400را خواهید دید که از سرور باطن می آید. یعنی پاسخ خطای400را در فاز Response دریافت شده از سرور هدف مطابق شکل زیر مشاهده خواهید کرد:
با کلیک بر روی نماد AX (Analytics Recorded) در ردیابی، نقطه پایانی هدفی را که درخواست برای آن ارسال شده است، تعیین کنید.

- به 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 پیکربندی شده باشد، باعث میشود که پردازشگر پیام Apigee Edge درخواستهای HTTP را به یک سرور هدف امن یا پیکربندی شده با TLS ارسال کند که منجر به این مشکل میشود.
تشخیص
از مراحل زیر برای تشخیص خطا با استفاده از ابزار Trace استفاده کنید:
- Trace را در رابط کاربری Apigee برای پروکسی API آسیب دیده فعال کنید.
- به پروکسی API درخواست دهید.
- یکی از درخواست های API که با کد پاسخ
400ناموفق بود را انتخاب کنید. - در مراحل مختلف پیمایش کنید و تعیین کنید که در کجا شکست رخ داده است.
معمولاً پاسخ خطای
400را خواهید دید که از سرور باطن می آید. یعنی پاسخ خطای400را در فاز Response دریافت شده از سرور مورد نظر مطابق شکل زیر خواهید دید:
با کلیک بر روی نماد AX (Analytics Recorded) در ردیابی، نقطه پایانی هدفی را که درخواست برای آن ارسال شده است، تعیین کنید.

به target.name توجه کنید که نشان دهنده نام نقطه پایانی هدف است.
در فایل ردیابی مثال بالا، target.name پیش فرض است. این نشان می دهد که نقطه پایانی مورد استفاده برای این درخواست پیش فرض است.
برای درک پیکربندی، تعریف نقطه پایانی هدف را مرور کنید.
نمونه پیکربندی نقطه پایانی هدف:
<?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استفاده می کنید.هنگامی که نام سرور مورد نظر را دارید، می توانید از یکی از روش های زیر برای بررسی پیکربندی سرور مورد نظر استفاده کنید:
- رابط کاربری لبه
- مدیریت API
رابط کاربری لبه
- به Apigee Edge > Admin > Environments > Target Servers بروید.
- سرور مورد نظر مشخص شده از پروکسی API را انتخاب کنید و روی ویرایش کلیک کنید.
- پورت مشخص شده برای سرور مورد نظر و اطلاعات SSL را بررسی کنید.
اگر سرور هدف با یک پورت امن پیکربندی شده است (به عنوان مثال:
443)، اما SSL فعال نیست، دلیل این مشکل همین است.
همانطور که در تصویر بالا می بینید، پورت استفاده شده
443است اما SSL برای آن پورت در پیکربندی سرور هدف فعال نیست. این باعث می شود که پردازشگر پیام Apigee Edge درخواست های HTTP را به پورت امن443ارسال کند. بنابراین، با خطای400 Bad Requestبا پیغامThe plain HTTP request was sent to HTTPS portمواجه می شوید.
مدیریت API
Get target server API را اجرا کنید تا جزئیات مربوط به پیکربندی سرور هدف خاص را مطابق شکل زیر دریافت کنید:
کاربر عمومی ابر:
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"
کاربر خصوصی 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وجود ندارد.این باعث می شود که پردازشگر پیام Apigee Edge درخواست های HTTP را به پورت امن
443ارسال کند. بنابراین، با خطای400 Bad Requestبا پیغامThe plain HTTP request was sent to HTTPS portمواجه می شوید.
قطعنامه
اگر سرور مورد نظر شما امن است یا با TLS پیکربندی شده است، باید SSL را برای سرور هدف خاص فعال کنید.
با استفاده از یکی از گزینه های زیر می توانید این کار را انجام دهید:
- رابط کاربری لبه
- مدیریت API
رابط کاربری لبه
- به سرور مورد نظر در Edge UI > Admin > Environments > Target Servers بروید.
- سرور مورد نظر خاص را انتخاب کنید و روی ویرایش کلیک کنید.
- اگر سرور مورد نظر شما امن است و از پورتی مانند
443استفاده میکند، SSL را با انتخاب کادر کنار گزینه SSL فعال کنید. - Truststore ، رمزها و پروتکل ها را پیکربندی کنید. (فقط در صورت نیاز)
مدیریت API
از API مدیریت برای پیکربندی سرور هدف همانطور که در مستندات پیکربندی سرور هدف به روز رسانی توضیح داده شده است استفاده کنید.
باید اطلاعات تشخیصی را جمع آوری کرد
اگر حتی پس از پیروی از دستورالعملهای بالا، مشکل همچنان ادامه داشت، اطلاعات تشخیصی زیر را جمعآوری کنید و سپس با پشتیبانی Apigee Edge تماس بگیرید.
- اگر کاربر Public Cloud هستید، اطلاعات زیر را ارائه دهید:
- نام سازمان
- نام محیط زیست
- نام پروکسی API
- برای بازتولید خطا، دستور curl را کامل کنید
- خروجی ابزار ردیابی (اگر توانسته اید برای درخواست ناموفق عکس بگیرید)
- اگر کاربر Private Cloud هستید، اطلاعات زیر را ارائه دهید:
- پیغام خطای کامل مشاهده شد
- نام محیط زیست
- بسته پروکسی API
- تعریف سرور هدف (اگر از سرور هدف در نقطه پایانی خود استفاده می کنید)
- خروجی ابزار ردیابی (اگر توانسته اید برای درخواست ناموفق عکس بگیرید)