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

شما در حال مشاهده اسناد Apigee Edge هستید.
به مستندات Apigee X بروید .
اطلاعات

علامت

برنامه سرویس گیرنده کد وضعیت HTTP 500 Internal Server Error را با protocol.http.BadPath کد خطا دریافت می کند.http.BadPath به عنوان پاسخی برای تماس های API.

پیغام خطا

برنامه مشتری کد پاسخ زیر را دریافت می کند:

HTTP/1.1 500 Internal Server Error

علاوه بر این، ممکن است پیغام خطای زیر را مشاهده کنید:

{
   "fault":{
      "faultstring":"Invalid request path",
      "detail":{
         "errorcode":"protocol.http.BadPath"
      }
   }
}

علل احتمالی

این خطا در صورتی رخ می دهد که URL درخواست سرور پشتیبان، که با متغیر جریان 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 مورد نیاز است و باید با یک اسلش رو به جلو ( / ) شروع شود و همیشه داشته باشد.

بنابراین، اگر URL درخواست سرور پشتیبان دارای یک جزء path باشد که با علامت سوال ( ? ) به جای اسلش رو به جلو ( / ) شروع می شود، Apigee Edge با 500 Internal Server Error و protocol.http.BadPath کد خطا پاسخ می دهد.http.BadPath .

به عنوان مثال: اگر target.url دارای مقدار https://www.mocktarget.apigee.net?json باشد، این خطا زمانی رخ می دهد که path نامعتبر است، زیرا به جای علامت سوال ( ? ) شروع می شود. یک اسلش رو به جلو ( / ).

علت توضیحات دستورالعمل های عیب یابی قابل اجرا برای
URL سرور Backend (target.url) دارای یک مسیر نامعتبر است مؤلفه مسیر در URL سرور باطن که با متغیر جریان target.url نشان داده شده است به جای اسلش رو به جلو ( / ) با علامت سؤال ( ? ) شروع می شود. کاربران Edge Public و Private Cloud

مراحل تشخیص رایج

برای تشخیص این خطا از یکی از ابزارها/تکنیک های زیر استفاده کنید:

مانیتورینگ API

روش شماره 1: استفاده از مانیتورینگ API

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

  1. به عنوان کاربر با نقش مناسب وارد رابط کاربری Apigee Edge شوید .
  2. به سازمانی که می‌خواهید در آن موضوع را بررسی کنید بروید.

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

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

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

  8. روی View logs کلیک کنید و ردیف درخواست ناموفق را گسترش دهید.

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

ردیابی

روش شماره 2: با استفاده از ابزار Trace

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

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

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

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

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

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

  7. بخش Variables Read and Assigned در هر یک از جریان‌های برگشتی از جریان خطا به سمت فاز شروع درخواست جریان هدف را بررسی کنید.
  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. در Trace به فاز AX (Analytics Data Recorded) بروید و روی آن کلیک کنید.
  12. به قسمت Phase Details - Error Headers بروید و مقادیر X-Apigee-fault-code و X-Apigee-fault-source را مطابق شکل زیر تعیین کنید:

  13. مقادیر X-Apigee-fault-code و X-Apigee-fault-source را به عنوان protocol.http.BadPath و target خواهید دید. target به ترتیب، نشان می دهد که این خطا به این دلیل است که URL سرور باطن دارای یک مسیر نامعتبر است.

    سرصفحه های پاسخ ارزش
    X-Apigee-fault-code protocol.http.BadPath
    X-Apigee-fault-source target

NGINX

روش شماره 3: استفاده از گزارش های دسترسی 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 را تعیین کنید.

    نمونه خطای 500 از گزارش دسترسی NGINX:

    ورودی نمونه بالا از گزارش دسترسی NGINX دارای مقادیر زیر برای X-Apigee-fault-code و X-Apigee-fault-source است:

    سرصفحه ها ارزش
    X-Apigee-fault-code protocol.http.BadPath
    X-Apigee-fault-source target

    توجه داشته باشید که مقادیر X-Apigee-fault-code و X-Apigee-fault-source protocol.http.BadPath و target هستند. target به ترتیب، نشان می دهد که این خطا به این دلیل است که URL سرور باطن دارای یک مسیر نامعتبر است.

علت: URL سرور Backend (target.url) دارای یک مسیر نامعتبر است

تشخیص

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

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

    ردیابی

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

    اگر ردی برای این خطا ثبت کرده اید، از مراحلی که در Using Trace tool توضیح داده شده است استفاده کنید.

    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 یا جاوا اسکریپت) که متغیر جریان target.url تغییر می دهد یا به روز می کند و علت به روز رسانی target.url را برای داشتن یک مسیر نامعتبر مشخص کنید.

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

    نمونه شماره 1

    نمونه شماره 1: متغیر 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 کد خطا برمی گرداند.http.BadPath.

    نمونه شماره 2

    نمونه شماره 2: خط مشی جاوا اسکریپت متغیر 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 کد خطا برمی گرداند.http.BadPath.

    نمونه شماره 3

    نمونه شماره 3: متغیر 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 کد خطا برمی گرداند.http.BadPath.

قطعنامه

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

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

    نمونه شماره 1

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

    از یک اسلش رو به جلو ( / ) به جای علامت سوال ( ? ) در url متغیر برای رفع این مشکل مانند شکل زیر استفاده کنید:

    var url = "https://mocktarget.apigee.net/json"
    context.setVariable("target.url", url);

    نمونه شماره 2

    نمونه شماره 2: خط مشی جاوا اسکریپت متغیر 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"
    

    نمونه شماره 3

    نمونه شماره 3: AssignMessage Policy به روز رسانی متغیر target.url

    یک مسیر معتبر در عنصر <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، بخش 3.3: مسیر

    اگر همچنان به کمک پشتیبانی Apigee نیاز دارید، به Must collect information diagnostic بروید.

    باید اطلاعات تشخیصی را جمع آوری کرد

    اگر حتی پس از پیروی از دستورالعمل‌های بالا، مشکل همچنان ادامه داشت، اطلاعات تشخیصی زیر را جمع‌آوری کنید و سپس با پشتیبانی Apigee Edge تماس بگیرید:

    اگر کاربر Public Cloud هستید، اطلاعات زیر را ارائه دهید:

    • نام سازمان
    • نام محیط زیست
    • نام پروکسی API
    • دستور کامل curl برای بازتولید 500 Internal Server Error با protocol.http.BadPath کد خطا استفاده می شود.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

    مراجع

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