شما در حال مشاهده مستندات Apigee Edge هستید.
به مستندات Apigee X مراجعه کنید . اطلاعات
علامت
برنامهی کلاینت، کد وضعیت HTTP با 500 Internal Server Error را به همراه کد خطای protocol.http.BadPath به عنوان پاسخی برای فراخوانیهای API دریافت میکند.
پیام خطا
برنامهی کلاینت کد پاسخ زیر را دریافت میکند:
HTTP/1.1 500 Internal Server Error
علاوه بر این، ممکن است پیام خطای زیر را مشاهده کنید:
{
"fault":{
"faultstring":"Invalid request path",
"detail":{
"errorcode":"protocol.http.BadPath"
}
}
}علل احتمالی
این خطا زمانی رخ میدهد که آدرس اینترنتی (URL) درخواستی سرور backend، که با متغیر جریان target.url نمایش داده میشود، حاوی path باشد path که به جای اسلش ( / ) با علامت سوال ( ? ) شروع میشود، که نامعتبر است.
طبق مشخصات RFC 3986، بخش 3: اجزای نحوی و RFC 3986، بخش 3.3: مسیر :
سینتکس URI دارای اجزای زیر است:
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment- جزء
pathالزامی است و باید با یک اسلش (/) شروع شود و همیشه یک اسلش (/) داشته باشد.
بنابراین، اگر آدرس اینترنتی درخواست سرور backend دارای یک جزء path باشد که با علامت سؤال ( ? ) به جای اسلش ( / ) شروع میشود، Apigee Edge با 500 Internal Server Error و error code protocol.http.BadPath پاسخ میدهد.
برای مثال: اگر target.url مقدار https://www.mocktarget.apigee.net?json را داشته باشد، این خطا رخ میدهد زیرا path نامعتبر تشخیص داده میشود، زیرا به جای اسلش ( / ) با علامت سوال ( ? ) شروع میشود.
| علت | توضیحات | دستورالعملهای عیبیابی قابل اجرا برای |
|---|---|---|
| آدرس URL سرور بکاند (target.url) مسیر نامعتبری دارد. | کامپوننت مسیر در URL سرور backend که توسط متغیر جریان target.url نمایش داده میشود، به جای اسلش ( / )، با علامت سوال ( ? ) شروع میشود. | کاربران فضای ابری عمومی و خصوصی Edge |
مراحل تشخیص مشترک
برای تشخیص این خطا از یکی از ابزارها/تکنیکهای زیر استفاده کنید:
نظارت بر API
روش شماره ۱: استفاده از مانیتورینگ API
برای تشخیص خطا با استفاده از مانیتورینگ API:
- به عنوان کاربری با نقش کاربری مناسب، وارد Apigee Edge UI شوید .
به سازمانی که میخواهید مشکل را در آن بررسی کنید، مراجعه کنید.

- به صفحه Analyze > API Monitoring > Investigate بروید.
- بازه زمانی خاصی را که در آن خطاها را مشاهده کردهاید، انتخاب کنید.
رسم کد خطا در مقابل زمان .
سلولی را انتخاب کنید که کد خطا
protocol.http.BadPathمانند تصویر زیر داشته باشد:
اطلاعات مربوط به کد خطا
protocol.http.BadPathبه صورت زیر نمایش داده میشود:
روی «مشاهده گزارشها» کلیک کنید و ردیف مربوط به درخواست ناموفق را باز کنید.

- از پنجره Logs ، جزئیات زیر را یادداشت کنید:
- کد وضعیت:
500 - منبع خطا:
target - کد خطا:
protocol.http.BadPath
- کد وضعیت:
- اگر منبع خطا
targetو کد خطاprotocol.http.BadPathباشد، نشان میدهد که URL سرور backend دارای مسیر نامعتبری است.
ردیابی
روش شماره ۲: استفاده از ابزار ردیابی
برای تشخیص خطا با استفاده از ابزار Trace:
- جلسه ردیابی را فعال کنید و یا
- منتظر بمانید تا خطای
500 Internal Server Errorرخ دهد، یا - اگر میتوانید مشکل را دوباره ایجاد کنید، فراخوانی API را برای ایجاد مجدد مشکل
500 Internal Server Errorانجام دهید.
- منتظر بمانید تا خطای
مطمئن شوید که گزینهی Show all FlowInfos فعال است:

- یکی از درخواستهای ناموفق را انتخاب کنید و مسیر پیگیری را بررسی کنید.
- مراحل مختلف ردیابی را طی کنید و محل وقوع خرابی را پیدا کنید.
معمولاً خطا را در جریانی پس از مرحلهی «شروع جریان درخواست هدف» مطابق شکل زیر خواهید یافت:

به مقدار خطا از ردیابی توجه کنید:
خطا: مسیر درخواست نامعتبر است
از آنجایی که این خطا توسط Apigee Edge پس از مرحلهی شروع جریان درخواست هدف (Target Request Flow Started ) رخ میدهد، نشان میدهد که آدرس اینترنتی سرور backend دارای مسیر نامعتبری است. این احتمال وجود دارد که اگر متغیر جریان
target.url(که نشان دهندهی آدرس اینترنتی سرور backend است) در Apigee Edge از طریق یکی از سیاستهای موجود در جریان درخواست هدف با یک مسیر نامعتبر بهروزرسانی شده باشد، این اتفاق بیفتد.- بخشهای «متغیرها خوانده شدند» و «متغیرهای اختصاص داده شده» را در هر یک از جریانهای رو به عقب از جریان خطا به سمت فاز «جریان درخواست هدف آغاز شده» بررسی کنید.
- سیاست را تعیین کنید، جایی که متغیر جریان
target.urlبهروزرسانی شد:نمونه ردیابی که نشاندهنده بهروزرسانی متغیر جریان
target.url:
در نمونه ردیابی نشان داده شده در بالا، توجه داشته باشید که مقدار متغیر جریان
target.urlدر یک سیاست جاوا اسکریپت به نامJS- SetTargetURLبه صورت زیر بهروزرسانی میشود:target.url : https://mocktarget.apigee.net?json - توجه داشته باشید که مقدار موجود در
target.urlدارای اجزای زیر است:- طرح:
https - مرجع:
mocktarget.apigee.net - مسیر:
?json
- طرح:
- از آنجایی که کامپوننت مسیر به جای اسلش (
/) با علامت سوال (?) شروع میشود، با خطایInvalid request pathمواجه میشوید. - در مسیر ردیابی، به مرحله AX (دادههای تحلیلی ثبتشده) بروید و روی آن کلیک کنید.
به پایین صفحه بروید تا به بخش جزئیات فاز - سرصفحههای خطا برسید و مقادیر X-Apigee-fault-code و X-Apigee-fault-source را مطابق شکل زیر تعیین کنید:

مقادیر X-Apigee-fault-code و X-Apigee-fault-source را به صورت
protocol.http.BadPathوtargetمشاهده خواهید کرد.targetبه ترتیب، نشان میدهد که این خطا به دلیل وجود مسیر نامعتبر در آدرس URL سرور backend ایجاد شده است.هدرهای پاسخ ارزش کد خطای X-Apigee protocol.http.BadPathمنبع گسل X-Apigee target
انجینکس
روش شماره ۳: استفاده از گزارشهای دسترسی NGINX
برای تشخیص خطا با استفاده از گزارشهای دسترسی NGINX:
- اگر شما یک کاربر Private Cloud هستید، میتوانید از گزارشهای دسترسی NGINX برای تعیین اطلاعات کلیدی در مورد
500 Internal Server Errorاستفاده کنید. گزارشهای دسترسی NGINX را بررسی کنید:
/opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_log- جستجو کنید تا ببینید آیا در یک بازه زمانی خاص (اگر مشکل در گذشته رخ داده است) خطای
500با کد خطاprotocol.http.BadPathوجود دارد یا خیر، یا اینکه آیا درخواستهایی با500همچنان با شکست مواجه میشوند. اگر هرگونه خطای
500با X-Apigee-fault-code که با مقدارprotocol.http.BadPathمطابقت دارد، پیدا کردید، مقدار X-Apigee-fault-source را تعیین کنید.نمونه خطای ۵۰۰ از لاگ دسترسی NGINX:

ورودی نمونه بالا از لاگ دسترسی NGINX دارای مقادیر زیر برای X-Apigee- fault-code و X-Apigee-fault-source است:
سربرگها ارزش کد خطای X-Apigee protocol.http.BadPathمنبع گسل X-Apigee targetتوجه داشته باشید که مقادیر X-Apigee-fault-code و X-Apigee-fault-source به ترتیب
protocol.http.BadPathوtargetهستند.targetبه ترتیب، نشان میدهد که این خطا به دلیل وجود یک مسیر نامعتبر در آدرس اینترنتی سرور backend ایجاد شده است.
علت: آدرس اینترنتی سرور بکاند (target.url) مسیر نامعتبری دارد
تشخیص
- کد خطا و منبع خطا را برای
500 Internal Server Errorبا استفاده از API Monitoring، Trace Tool یا گزارشهای دسترسی NGINX همانطور که در مراحل تشخیص مشترک توضیح داده شده است، تعیین کنید. - اگر کد خطا
protocol.http.BadPathباشد و Fault Source مقدارtargetداشته باشد، این نشان میدهد که URL سرور backend دارای یک مسیر نامعتبر است. آدرس اینترنتی سرور backend توسط متغیر جریان
target.urlدر Apigee Edge نمایش داده میشود. این خطا معمولاً زمانی رخ میدهد که سعی کنید آدرس اینترنتی سرور backend (target.url) را به صورت پویا با استفاده از هر یک از سیاستهای (درون جریان پروکسی/اشتراکی) در جریان درخواست Target بهروزرسانی کنید، به طوری که مسیر نامعتبری داشته باشد.با استفاده از یکی از روشهای زیر، مشخص کنید که آیا متغیر جریان
target.urlواقعاً مسیر نامعتبری دارد و منبع مقدار آن چیست:ردیابی
استفاده از ابزار ردیابی
اگر برای این خطا ردیابی انجام دادهاید، از مراحل توضیح داده شده در ابزار استفاده از ردیابی استفاده کنید و
- بررسی کنید که آیا
target.urlمسیر نامعتبری دارد یا خیر، یعنی اگر به جای اسلش (/) با علامت سوال (?) شروع شود. اگر بله، پس سیاستی را که مقدار
target.urlرا تغییر داده یا بهروزرسانی کرده تا حاوی یک مسیر نامعتبر باشد، پیدا کنید.نمونه ردیابی که نشاندهنده بهروزرسانی متغیر جریان
target.urlتوسط سیاست جاوا اسکریپت است
- در نمونه ردیابی بالا، توجه کنید که سیاست جاوا اسکریپت مقدار
target.urlرا تغییر داده یا بهروزرسانی کرده است تا حاوی یک مسیر نامعتبر باشد. - توجه داشته باشید که
target.urlاجزای زیر را دارد:- طرح:
https - مرجع:
mocktarget.apigee.net - مسیر:
?json
مسیر به جای اسلش (
/) با علامت سوال (?) شروع میشود ، بنابراین نامعتبر است. - طرح:
سیاههها
استفاده از گزارشها در سرور گزارشگیری
- اگر اثری از این خطا ندارید (یک مشکل متناوب)، بررسی کنید که آیا اطلاعات مربوط به مقدار متغیر جریان
target.urlرا با استفاده از سیاستهایی مانند MessageLogging یا ServiceCallout در سرور گزارش خود ثبت کردهاید یا خیر. - اگر گزارشها را دارید، آنها را بررسی کنید و
- بررسی کنید که آیا
target.urlمسیر نامعتبری دارد یا خیر، و - ببینید آیا میتوانید اطلاعاتی در مورد اینکه کدام پالیسی
target.urlتغییر یافته باید شامل مسیر نامعتبر باشد، تعیین کنید.
- بررسی کنید که آیا
پروکسی API
بررسی پروکسی API ناموفق
اگر هیچ ردی یا گزارشی برای این خطا ندارید، پروکسی API از کار افتاده را بررسی کنید تا مشخص شود چه چیزی متغیر جریان
target.urlتغییر داده یا بهروزرسانی کرده تا حاوی یک مسیر نامعتبر باشد. موارد زیر را بررسی کنید:- سیاست درون پروکسی API
- هر جریان مشترکی که از پروکسی فراخوانی شود
- بررسی کنید که آیا
سیاست خاص (برای مثال: AssignMessage یا JavaScript) که متغیر جریان
target.urlتغییر یا بهروزرسانی میکند را با دقت بررسی کنید و علت بهروزرسانیtarget.urlبه دلیل داشتن یک مسیر نامعتبر را تعیین کنید.در اینجا چند نمونه از سیاستهایی که متغیر جریان
target.urlبه اشتباه بهروزرسانی میکنند تا حاوی یک مسیر نامعتبر باشند که منجر به این خطا میشود، آورده شده است.نمونه شماره ۱
نمونه شماره ۱: بهروزرسانی متغیر
target.urlبا استفاده از سیاست جاوا اسکریپتvar url = "https://mocktarget.apigee.net?json" context.setVariable("target.url", url);
در مثال بالا، توجه داشته باشید که متغیر جریان
target.urlبا مقدارhttps://mocktarget.apigee.net?jsonکه در متغیر دیگری بهurl .توجه داشته باشید که مقدار
urlشامل اجزای زیر است:- طرح:
https - مرجع:
mocktarget.apigee.net - مسیر:
?json
مسیر به جای اسلش (
/) با علامت سوال (?) شروع میشود که نامعتبر است. بنابراین، Apigee Edge500 Internal Server Errorبا کد خطاprotocol.http.BadPathبرمیگرداند.نمونه شماره ۲
نمونه شماره ۲: سیاست جاوا اسکریپت برای بهروزرسانی متغیر
target.urlبر اساس مقدار موجود در هدر درخواستvar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
در مثال بالا، توجه کنید که متغیر جریان
target.urlبا الحاق مقدارhttps://mocktarget.apigee.netموجود در یک متغیرurlبهروزرسانی میشود.urlو مقدار متغیر دیگری بهpathکه مقدار آن ازrequest.header.Path .اگر به درخواست یا ردیابی واقعی دسترسی دارید، میتوانید مقدار واقعی ارسال شده به
request.header.Pathرا تأیید کنید.نمونه درخواست ارسالی توسط کاربر
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: ?user"
در این مثال، مسیر هدر به عنوان بخشی از درخواست ارسال نمیشود. بنابراین، مقدار متغیر
pathدر سیاست جاوا اسکریپتnullاست.بنابراین:
-
url = https://mocktarget.apigee.net + path -
url = https://mocktarget.apigee.net + "?user" -
target.url = https://mocktarget.apigee.net?user
توجه داشته باشید که مقدار
target.urlدارای اجزای زیر است:- طرح:
https - مرجع:
mocktarget.apigee.net - مسیر:
?user
مسیر به جای اسلش (
/) با علامت سوال (?) شروع میشود که نامعتبر است. از این رو، Apigee Edge500 Internal Server Errorبا کد خطاprotocol.http.BadPathبرمیگرداند.نمونه شماره ۳
نمونه شماره ۳: بهروزرسانی متغیر
target.urlبا استفاده از سیاست AssignMessage<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net?echo</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
توجه داشته باشید که مقدار
urlدارای اجزای زیر است:- طرح:
https - مرجع:
mocktarget.apigee.net - مسیر:
?echo
باز هم در این مثال، مسیر به جای اسلش (
/) با علامت سوال (?) شروع میشود که نامعتبر است. بنابراین، Apigee Edge500 Internal Server Errorرا با کد خطاprotocol.http.BadPathبرمیگرداند.- طرح:
وضوح تصویر
طبق مشخصات URL در RFC 3986، بخش 3: اجزای نحوی ، جزء path الزامی است و باید همیشه با "/" شروع شود. بنابراین مراحل زیر را برای رفع این مشکل دنبال کنید:
- مطمئن شوید که آدرس اینترنتی سرور backend، که توسط متغیر جریان
target.urlنمایش داده میشود، همیشه یک مسیر معتبر دارد و همیشه با یک اسلش (/) شروع میشود .- در برخی موارد، ممکن است نام منبع در مسیر وجود نداشته باشد، بنابراین مطمئن شوید که مسیر حداقل دارای یک اسلش (
/) باشد. - اگر از متغیرهای دیگری برای تعیین مقدار متغیر جریان
target.urlاستفاده میکنید، مطمئن شوید که سایر متغیرها مسیر نامعتبری ندارند. - اگر هرگونه عملیات رشتهای را برای تعیین مقدار متغیر جریان
target.urlانجام میدهید، مطمئن شوید که نتیجه یا خروجی عملیات رشتهای، مسیر نامعتبری نداشته باشد.
- در برخی موارد، ممکن است نام منبع در مسیر وجود نداشته باشد، بنابراین مطمئن شوید که مسیر حداقل دارای یک اسلش (
در نمونههای مورد بحث در بالا، میتوانید این مشکل را طبق توضیحات زیر برطرف کنید:
نمونه شماره ۱
نمونه شماره ۱: بهروزرسانی متغیر
target.urlبا استفاده از سیاست جاوا اسکریپتبرای رفع این مشکل، به جای علامت سوال (
?) در متغیرurlاز اسلش (/) استفاده کنید، همانطور که در زیر نشان داده شده است:var url = "https://mocktarget.apigee.net/json" context.setVariable("target.url", url);
نمونه شماره ۲
نمونه شماره ۲: سیاست جاوا اسکریپت برای بهروزرسانی متغیر
target.urlبر اساس مقدار موجود در هدر درخواستvar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
مطمئن شوید که یک مسیر معتبر، مثلاً:
/userبه عنوان بخشی ازPathهدر درخواست، برای رفع این مشکل، همانطور که در زیر نشان داده شده است، وارد میکنید:درخواست نمونه:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /user"
نمونه شماره ۳
نمونه شماره ۳: بهروزرسانی متغیر
target.urlتوسط AssignMessage Policyیک مسیر معتبر در عنصر
<Value>از سیاست AssignMessage اضافه کنید. یعنی، علامت سوال (?) را جایگزین کنید. با یک اسلش رو به جلو (/) در عنصر<Value>قرار دهید و آن را رویhttps://mocktarget.apigee.net/echoتنظیم کنید تا این مشکل مانند تصویر زیر برطرف شود:<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net/echo</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
مشخصات
Apigee Edge انتظار دارد که
pathجزء در سرور بکاند، آدرس اینترنتی (URL) باید همیشه با a شروع شود. اسلش رو به جلو (/) طبق مشخصات زیر:مشخصات RFC 3986، بخش 3: اجزای نحوی RFC 3986، بخش ۳.۳: مسیر اگر هنوز به هرگونه کمکی از پشتیبانی Apigee نیاز دارید، به بخش «باید اطلاعات تشخیصی را جمعآوری کنید» بروید.
باید اطلاعات تشخیصی جمعآوری کند
اگر مشکل حتی پس از دنبال کردن دستورالعملهای بالا ادامه داشت، اطلاعات تشخیصی زیر را جمعآوری کنید و سپس با پشتیبانی Apigee Edge تماس بگیرید:
اگر کاربر فضای ابری عمومی هستید، اطلاعات زیر را ارائه دهید:
- نام سازمان
- نام محیط
- نام پروکسی API
- دستور
curlکامل که برای تولید مجدد500 Internal Server Errorبا کد خطاprotocol.http.BadPathاستفاده میشود. - فایل ردیابی برای درخواستهای API
اگر کاربر Private Cloud هستید، اطلاعات زیر را ارائه دهید:
- پیام خطای کامل مشاهده شده برای درخواستهای ناموفق
- نام محیط
- بسته پروکسی API
- فایل ردیابی برای درخواستهای 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
منابع