500 خطای سرور داخلی - BadPath

شما در حال مشاهده مستندات 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: مسیر :

  1. سینتکس URI دارای اجزای زیر است:

            foo://example.com:8042/over/there?name=ferret#nose
            \_/   \______________/\_________/ \_________/ \__/
             |            |            |            |       |
          scheme      authority       path        query   fragment
    
  2. جزء 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:

  1. به عنوان کاربری با نقش کاربری مناسب، وارد Apigee Edge UI شوید .
  2. به سازمانی که می‌خواهید مشکل را در آن بررسی کنید، مراجعه کنید.

  3. به صفحه Analyze > API Monitoring > Investigate بروید.
  4. بازه زمانی خاصی را که در آن خطاها را مشاهده کرده‌اید، انتخاب کنید.
  5. رسم کد خطا در مقابل زمان .

  6. سلولی را انتخاب کنید که کد خطا protocol.http.BadPath مانند تصویر زیر داشته باشد:

  7. اطلاعات مربوط به کد خطا protocol.http.BadPath به صورت زیر نمایش داده می‌شود:

  8. روی «مشاهده گزارش‌ها» کلیک کنید و ردیف مربوط به درخواست ناموفق را باز کنید.

  9. از پنجره Logs ، جزئیات زیر را یادداشت کنید:
    • کد وضعیت: 500
    • منبع خطا: target
    • کد خطا: protocol.http.BadPath
  10. اگر منبع خطا target و کد خطا protocol.http.BadPath باشد، نشان می‌دهد که URL سرور backend دارای مسیر نامعتبری است.

ردیابی

روش شماره ۲: استفاده از ابزار ردیابی

برای تشخیص خطا با استفاده از ابزار Trace:

  1. جلسه ردیابی را فعال کنید و یا
    • منتظر بمانید تا خطای 500 Internal Server Error رخ دهد، یا
    • اگر می‌توانید مشکل را دوباره ایجاد کنید، فراخوانی API را برای ایجاد مجدد مشکل 500 Internal Server Error انجام دهید.
  2. مطمئن شوید که گزینه‌ی Show all FlowInfos فعال است:

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

  6. به مقدار خطا از ردیابی توجه کنید:

    خطا: مسیر درخواست نامعتبر است

    از آنجایی که این خطا توسط Apigee Edge پس از مرحله‌ی شروع جریان درخواست هدف (Target Request Flow Started ) رخ می‌دهد، نشان می‌دهد که آدرس اینترنتی سرور backend دارای مسیر نامعتبری است. این احتمال وجود دارد که اگر متغیر جریان target.url (که نشان دهنده‌ی آدرس اینترنتی سرور backend است) در Apigee Edge از طریق یکی از سیاست‌های موجود در جریان درخواست هدف با یک مسیر نامعتبر به‌روزرسانی شده باشد، این اتفاق بیفتد.

  7. بخش‌های «متغیرها خوانده شدند» و «متغیرهای اختصاص داده شده» را در هر یک از جریان‌های رو به عقب از جریان خطا به سمت فاز «جریان درخواست هدف آغاز شده» بررسی کنید.
  8. سیاست را تعیین کنید، جایی که متغیر جریان target.url به‌روزرسانی شد:

    نمونه ردیابی که نشان‌دهنده به‌روزرسانی متغیر جریان target.url:

    در نمونه ردیابی نشان داده شده در بالا، توجه داشته باشید که مقدار متغیر جریان target.url در یک سیاست جاوا اسکریپت به نام JS- SetTargetURL به صورت زیر به‌روزرسانی می‌شود: target.url : https://mocktarget.apigee.net?json

  9. توجه داشته باشید که مقدار موجود در target.url دارای اجزای زیر است:
    • طرح: https
    • مرجع: mocktarget.apigee.net
    • مسیر: ?json
  10. از آنجایی که کامپوننت مسیر به جای اسلش ( / ) با علامت سوال ( ? ) شروع می‌شود، با خطای Invalid request path مواجه می‌شوید.
  11. در مسیر ردیابی، به مرحله AX (داده‌های تحلیلی ثبت‌شده) بروید و روی آن کلیک کنید.
  12. به پایین صفحه بروید تا به بخش جزئیات فاز - سرصفحه‌های خطا برسید و مقادیر X-Apigee-fault-code و X-Apigee-fault-source را مطابق شکل زیر تعیین کنید:

  13. مقادیر 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:

  1. اگر شما یک کاربر Private Cloud هستید، می‌توانید از گزارش‌های دسترسی NGINX برای تعیین اطلاعات کلیدی در مورد 500 Internal Server Error استفاده کنید.
  2. گزارش‌های دسترسی NGINX را بررسی کنید:

    /opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_log

  3. جستجو کنید تا ببینید آیا در یک بازه زمانی خاص (اگر مشکل در گذشته رخ داده است) خطای 500 با کد خطا protocol.http.BadPath وجود دارد یا خیر، یا اینکه آیا درخواست‌هایی با 500 همچنان با شکست مواجه می‌شوند.
  4. اگر هرگونه خطای 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) مسیر نامعتبری دارد

تشخیص

  1. کد خطا و منبع خطا را برای 500 Internal Server Error با استفاده از API Monitoring، Trace Tool یا گزارش‌های دسترسی NGINX همانطور که در مراحل تشخیص مشترک توضیح داده شده است، تعیین کنید.
  2. اگر کد خطا protocol.http.BadPath باشد و Fault Source مقدار target داشته باشد، این نشان می‌دهد که URL سرور backend دارای یک مسیر نامعتبر است.
  3. آدرس اینترنتی سرور backend توسط متغیر جریان target.url در Apigee Edge نمایش داده می‌شود. این خطا معمولاً زمانی رخ می‌دهد که سعی کنید آدرس اینترنتی سرور backend ( target.url ) را به صورت پویا با استفاده از هر یک از سیاست‌های (درون جریان پروکسی/اشتراکی) در جریان درخواست Target به‌روزرسانی کنید، به طوری که مسیر نامعتبری داشته باشد.

  4. با استفاده از یکی از روش‌های زیر، مشخص کنید که آیا متغیر جریان target.url واقعاً مسیر نامعتبری دارد و منبع مقدار آن چیست:

    ردیابی

    استفاده از ابزار ردیابی

    اگر برای این خطا ردیابی انجام داده‌اید، از مراحل توضیح داده شده در ابزار استفاده از ردیابی استفاده کنید و

    1. بررسی کنید که آیا target.url مسیر نامعتبری دارد یا خیر، یعنی اگر به جای اسلش ( / ) با علامت سوال ( ? ) شروع شود.
    2. اگر بله، پس سیاستی را که مقدار target.url را تغییر داده یا به‌روزرسانی کرده تا حاوی یک مسیر نامعتبر باشد، پیدا کنید.

      نمونه ردیابی که نشان‌دهنده به‌روزرسانی متغیر جریان target.url توسط سیاست جاوا اسکریپت است

    3. در نمونه ردیابی بالا، توجه کنید که سیاست جاوا اسکریپت مقدار target.url را تغییر داده یا به‌روزرسانی کرده است تا حاوی یک مسیر نامعتبر باشد.
    4. توجه داشته باشید که target.url اجزای زیر را دارد:
      • طرح: https
      • مرجع: mocktarget.apigee.net
      • مسیر: ?json

      مسیر به جای اسلش ( / ) با علامت سوال ( ? ) شروع می‌شود ، بنابراین نامعتبر است.

    سیاههها

    استفاده از گزارش‌ها در سرور گزارش‌گیری

    1. اگر اثری از این خطا ندارید (یک مشکل متناوب)، بررسی کنید که آیا اطلاعات مربوط به مقدار متغیر جریان target.url را با استفاده از سیاست‌هایی مانند MessageLogging یا ServiceCallout در سرور گزارش خود ثبت کرده‌اید یا خیر.
    2. اگر گزارش‌ها را دارید، آنها را بررسی کنید و
      1. بررسی کنید که آیا target.url مسیر نامعتبری دارد یا خیر، و
      2. ببینید آیا می‌توانید اطلاعاتی در مورد اینکه کدام پالیسی target.url تغییر یافته باید شامل مسیر نامعتبر باشد، تعیین کنید.

    پروکسی API

    بررسی پروکسی API ناموفق

    اگر هیچ ردی یا گزارشی برای این خطا ندارید، پروکسی API از کار افتاده را بررسی کنید تا مشخص شود چه چیزی متغیر جریان target.url تغییر داده یا به‌روزرسانی کرده تا حاوی یک مسیر نامعتبر باشد. موارد زیر را بررسی کنید:

    • سیاست درون پروکسی API
    • هر جریان مشترکی که از پروکسی فراخوانی شود
  5. سیاست خاص (برای مثال: 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 Edge 500 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 Edge 500 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 Edge 500 Internal Server Error را با کد خطا protocol.http.BadPath برمی‌گرداند.

وضوح تصویر

طبق مشخصات URL در RFC 3986، بخش 3: اجزای نحوی ، جزء path الزامی است و باید همیشه با "/" شروع شود. بنابراین مراحل زیر را برای رفع این مشکل دنبال کنید:

  1. مطمئن شوید که آدرس اینترنتی سرور backend، که توسط متغیر جریان target.url نمایش داده می‌شود، همیشه یک مسیر معتبر دارد و همیشه با یک اسلش ( / ) شروع می‌شود .
    1. در برخی موارد، ممکن است نام منبع در مسیر وجود نداشته باشد، بنابراین مطمئن شوید که مسیر حداقل دارای یک اسلش ( / ) باشد.
    2. اگر از متغیرهای دیگری برای تعیین مقدار متغیر جریان target.url استفاده می‌کنید، مطمئن شوید که سایر متغیرها مسیر نامعتبری ندارند.
    3. اگر هرگونه عملیات رشته‌ای را برای تعیین مقدار متغیر جریان target.url انجام می‌دهید، مطمئن شوید که نتیجه یا خروجی عملیات رشته‌ای، مسیر نامعتبری نداشته باشد.
  2. در نمونه‌های مورد بحث در بالا، می‌توانید این مشکل را طبق توضیحات زیر برطرف کنید:

    نمونه شماره ۱

    نمونه شماره ۱: به‌روزرسانی متغیر 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

    منابع

    متغیرهای جریان - هدف