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

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

علامت

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

پیغام خطا

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

HTTP/1.1 500 Internal Server Error

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

{
   "fault":{
      "faultstring":"Request path cannot be empty",
      "detail":{
         "errorcode":"protocol.http.EmptyPath"
      }
   }
}

علل احتمالی

این خطا در صورتی رخ می دهد که URL درخواست سرور پشتیبان، که با متغیر جریان target.url نشان داده شده است، حاوی یک مسیر خالی باشد.

مطابق با مشخصات 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.EmptyPath .

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

علت توضیحات دستورالعمل های عیب یابی قابل اجرا برای
URL سرور بکاند (target.url) مسیر خالی دارد URL سرور Backend که با متغیر جریان 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.EmptyPath کد خطا باشد.http.EmptyPath مانند شکل زیر:

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

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

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

ردیابی

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

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

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

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

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

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

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

  7. بخش Variables Read and Assigned در هر یک از جریان‌ها را از نقطه خطا به سمت فاز شروع درخواست هدف بررسی کنید.
  8. خط مشی را تعیین کنید که در آن متغیر جریان target.url به روز می شود.

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

    در نمونه ردیابی نشان داده شده در بالا، به مقدار متغیر flow target.url توجه کنید target.url در یک خط مشی جاوا اسکریپت به نام SetTargetURL به صورت زیر به روز می شود:

    target.url : https://mocktarget.apigee.net
  9. توجه داشته باشید که target.url دارای اجزای زیر است:
    • طرح: https://mocktarget.apigee.net
    • مسیر: خالی
  10. بنابراین، با خطا مواجه می‌شوید. Request path cannot be empty .
  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.EmptyPath و target خواهید دید. target به ترتیب، نشان می دهد که این خطا به این دلیل است که URL سرور باطن دارای یک مسیر خالی است.
    سرصفحه های پاسخ ارزش
    X-Apigee-fault-code protocol.http.EmptyPath
    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.EmptyPath کد خطا وجود دارد.http.EmptyPath در طول یک مدت زمان خاص (اگر مشکل در گذشته اتفاق افتاده باشد) یا اینکه آیا هنوز درخواست هایی وجود دارد که با 500 ناموفق هستند.
  4. اگر هر 500 خطا با کد X-Apigee-fault-code مطابق با مقدار protocol.http.EmptyPath پیدا کردید، سپس مقدار X-Apigee-fault-source را تعیین کنید.

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

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

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

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

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

تشخیص

  1. کد خطا و منبع خطا را برای 500 Internal Server Error با استفاده از API Monitoring، Trace Tool یا گزارش های دسترسی NGINX همانطور که در مراحل تشخیص رایج توضیح داده شده است، تعیین کنید.
  2. اگر کد خطا protocol.http.EmptyPath است.http.EmptyPath و منبع خطا دارای مقدار 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
      • مسیر: خالی

    سیاههها

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

    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"
    context.setVariable("target.url", url);

    در نمونه بالا، توجه کنید که متغیر جریان target.url با مقدار https://mocktarget.apigee.net موجود در url متغیر دیگری به روز شده است.

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

    • طرح: https://mocktarget.apigee.net
    • مسیر: خالی

    از آنجایی که مسیر خالی است، Apigee Edge 500 Internal Server Error با protocol.http.EmptyPath کد خطا برمی گرداند.http.EmptyPath.

    نمونه شماره 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>
    

    در این مثال، مسیر هدر به عنوان بخشی از درخواست ارسال نمی شود. بنابراین، مقدار مسیر متغیر در خط مشی جاوا اسکریپت null است.

    بنابراین:

    • url = https://mocktarget.apigee.net + path
    • url = https://mocktarget.apigee.net + null
    • target.url = https://mocktarget.apigee.netnull

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

    • طرح: https://mocktarget.apigee.netnull
    • مسیر: خالی

    نمونه شماره 3

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

    <AssignMessage async="false" continueOnError="false" enabled="true" name=">AM-SetTargetURL">
        <DisplayName>AM-SetTargetURL</DisplayName>
        <AssignVariable>
             <Name>target.url</Name>
             <Value>https://mocktarget.apigee.net</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>

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

    • طرح: https://mocktarget.apigee.net
    • مسیر: خالی

    در تمام مثال‌های بالا، مسیر URL سرور backend، یعنی target.url خالی است، بنابراین Apigee Edge 500 Internal Server Error با protocol.http.EmptyPath کد خطا برمی‌گرداند.http.EmptyPath.

قطعنامه

طبق مشخصات RFC 3986، بخش 2: اجزای نحوی ، مؤلفه path مورد نیاز است و باید همیشه یک اسلش رو به جلو (/) داشته باشد، حتی اگر هیچ کاراکتر دیگری به عنوان بخشی از path وجود نداشته باشد. برای رفع این مشکل مراحل زیر را انجام دهید:

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

    نمونه شماره 1

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

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

    var url = "https://mocktarget.apigee.net/"
    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);

    اطمینان حاصل کنید که یک مسیر معتبر، به عنوان مثال، /iloveapis به عنوان بخشی از Path هدر درخواست عبور می‌دهید تا این مشکل را مطابق شکل زیر برطرف کنید:

    نمونه درخواست:

    curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /iloveapis"
    

    نمونه شماره 3

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

    یک مسیر معتبر در عنصر <Value> سیاست AssignMessage اضافه کنید. به عنوان مثال، می توانید /json داشته باشید /json به عنوان مسیر MockTarget API . یعنی عنصر <Value> را مطابق شکل زیر به https://mocktarget.apigee.net/json تغییر دهید:

    <AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL">
        <DisplayName>AM-SetTargetURL</DisplayName>
        <AssignVariable>
             <Name>target.url</Name>
             <Value>https://mocktarget.apigee.net/json</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>

مشخصات

Apigee Edge انتظار دارد که URL سرور پشتیبان طبق مشخصات زیر یک مسیر خالی نداشته باشد :

مشخصات
RFC 3986، بخش 3: اجزای نحوی
RFC 3986، بخش 3.3: مسیر

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

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

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

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

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

مراجع

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