‫۵۰۰ خطای سرور داخلی - EmptyPath

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

نشانه

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

پیام خطا

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

HTTP/1.1 500 Internal Server Error

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

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

علل احتمالی

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

طبق مشخصات RFC 3986، بخش ۳: مؤلفه‌های دستور زبان و RFC 3986، بخش ۳.۳: مسیر:

  1. نحو URI دارای عناصر زیر است:

            foo://example.com:8042/over/there?name=ferret#nose
            \_/   \______________/\_________/ \_________/ \__/
             |            |            |            |       |
          scheme      authority       path        query   fragment
    
  2. عنصر path الزامی است و همیشه باید خط مورب (/) داشته باشد، حتی اگر نویسه‌های دیگری به‌عنوان بخشی از مسیر وجود نداشته باشد.

بنابراین، اگر نشانی وب درخواست سرور پشتیبان اصلاً مؤلفه path را نداشته باشد، یعنی حتی خط مورب (/) هم نداشته باشد، Apigee Edge با 500 Internal Server Error و کد خطای protocol.http.EmptyPath پاسخ می‌دهد.

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

علت شرح دستورالعمل‌های عیب‌یابی برای موارد زیر قابل‌اجرا است
نشانی وب سرور پشتیبان (target.url) مسیر خالی دارد نشانی وب سرور «پشتیبان» که با متغیر جریان target.url نشان داده می‌شود مسیر خالی دارد. کاربران «فضای ابری خصوصی و عمومی لبه‌ای»

مراحل متداول تشخیص خرابی

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

پایش میانای برنامه‌سازی کاربردی

رویه شماره ۱: استفاده از «پایش میانای برنامه‌سازی کاربردی»

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

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

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

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

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

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

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

ردیابی

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

برای تشخیص خرابی بااستفاده از ابزار «ردیابی»:

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

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

  6. مقدار خطا را از ردیابی یادداشت کنید.

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

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

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

    نمونه ردیابی که نشان می‌دهد خط‌مشی جاوا اسکریپت متغیر جریان 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. به فاز AX (داده‌های Analytics ضبط‌شده) در ردیابی بروید و روی آن کلیک کنید.
  12. به بخش جزئیات فاز - سرایندهای خطا پیمایش کنید و مقادیر X-Apigee-fault-code و X-Apigee-fault-source را همان‌طور که در زیر نشان داده شده است تعیین کنید:

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

NGINX

رویه شماره ۳: استفاده از گزارش‌های دسترسی NGINX

برای تشخیص خطا بااستفاده از گزارش‌های دسترسی NGINX:

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

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

  3. جستجو کنید تا ببینید آیا درطول مدت مشخصی (اگر مشکل در گذشته رخ داده است) خطاهای 500 با کد خطای protocol.http.EmptyPath وجود دارد یا نه یا اینکه آیا درخواست‌هایی هنوز با 500 ناموفق هستند یا نه.
  4. اگر خطاهای 500 را با X-Apigee-fault-code مطابقت با مقدار protocol.http.EmptyPath پیدا کردید، مقدار X-Apigee-fault-source را تعیین کنید.

    نمونه خطای ۵۰۰ از گزارش دسترسی 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) مسیر خالی دارد

تشخیص

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

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

    ردیابی

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

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

    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 را به‌گونه‌ای تغییر داده است که مسیر خالی داشته باشد

    پراکسی میانای برنامه‌سازی کاربردی

    درحال بررسی پراکسی میانای برنامه‌سازی کاربردی ناموفق

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

    • خط‌مشی درون پراکسی API
    • هر جریانی که از پراکسی فراخوانی شده است
  5. خط‌مشی خاصی را که متغیر جریان target.url را اصلاح یا به‌روزرسانی می‌کند (برای نمونه، AssignMessage یا JavaScript) به‌دقت بررسی کنید و دلیل به‌روزرسانی target.url برای داشتن مسیر خالی را تعیین کنید.

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

    نمونه شماره ۱

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

    نمونه شماره ۲

    نمونه شماره ۲: به‌روزرسانی خط‌مشی جاوا اسکریپت 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 و مقدار متغیر دیگری 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
    • مسیر: خالی

    نمونه شماره ۳

    نمونه شماره ۳: خط‌مشی AssignMessage متغیر 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
    • مسیر: خالی

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

وضوح

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

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

    نمونه شماره ۱

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

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

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

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

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

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

    نمونه شماره ۳

    نمونه شماره ۳: خط‌مشی AssignMessage متغیر target.url را ازطریق متغیر دیگری به‌روزرسانی می‌کند

    مسیر معتبری را در عنصر <Value> خط‌مشی «اختصاص پیام» اضافه کنید. برای مثال، می‌توانید /json را به‌عنوان مسیر میانای برنامه‌سازی کاربردی MockTarget داشته باشید. یعنی عنصر <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 انتظار دارد که نشانی وب سرور پشتیبان طبق مشخصات زیر مسیر خالی نداشته باشد:

مشخصات
RFC 3986، بخش ۳: عناصر دستور زبان
RFC 3986، بخش ۳.۳: مسیر

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

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

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

اگر کاربر «ابر عمومی» هستید، اطلاعات زیر را ارائه دهید:

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

مرجع‌ها

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