500 خطای سرور داخلی - 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"
      }
   }
}

علل احتمالی

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

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

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

علت توضیحات دستورالعمل‌های عیب‌یابی قابل اجرا برای
آدرس اینترنتی سرور بک‌اند (target.url) مسیر خالی دارد آدرس اینترنتی سرور Backend که توسط متغیر جریان target.url نمایش داده می‌شود، یک مسیر خالی دارد. کاربران فضای ابری عمومی و خصوصی Edge

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

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

نظارت بر API

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

برای تشخیص خطا با استفاده از مانیتورینگ API:

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

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

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

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

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

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

ردیابی

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

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

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

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

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

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

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

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

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

  13. مقادیر X-Apigee-fault-code و X-Apigee-fault-source را به صورت protocol.http.EmptyPath و target مشاهده خواهید کرد. target به ترتیب، نشان می‌دهد که این خطا به دلیل وجود مسیر خالی در آدرس اینترنتی سرور backend ایجاد شده است.
    هدرهای پاسخ ارزش
    کد خطای X-Apigee protocol.http.EmptyPath
    منبع گسل 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.EmptyPath وجود دارد یا خیر، یا اینکه آیا درخواست‌هایی با 500 همچنان با شکست مواجه می‌شوند.
  4. اگر هرگونه خطای 500 با کد خطای X-Apigee-fault-code که با مقدار protocol.http.EmptyPath مطابقت دارد، پیدا کردید، مقدار منبع خطای X-Apigee-fault را تعیین کنید.

    نمونه خطای ۵۰۰ از لاگ دسترسی NGINX:

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

    سربرگ‌ها ارزش
    کد خطای X-Apigee protocol.http.EmptyPath
    منبع گسل X-Apigee target

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

علت: آدرس اینترنتی سرور بک‌اند (target.url) مسیر خالی دارد

تشخیص

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

  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 تغییر یافته در پالیسی، حاوی یک مسیر خالی باشد.

    پروکسی API

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

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

    • سیاست درون پروکسی API
    • هر جریان مشترکی که از پروکسی فراخوانی شود
  5. سیاست خاص (مثلاً AssignMessage یا JavaScript) که متغیر جریان target.url تغییر یا به‌روزرسانی می‌کند، با دقت بررسی کنید و علت به‌روزرسانی 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 به‌روزرسانی می‌شود. url و مقدار متغیر دیگری به path که مقدار آن از request.header.Path .

    اگر به درخواست یا ردیابی واقعی دسترسی دارید، می‌توانید مقدار واقعی ارسال شده به request.header.Path را تأیید کنید.

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

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

    در این مثال، مسیر هدر به عنوان بخشی از درخواست ارسال نمی‌شود. بنابراین، مقدار متغیر path در سیاست جاوا اسکریپت 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
    • مسیر: خالی

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

وضوح تصویر

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

  1. مطمئن شوید که آدرس اینترنتی سرور backend، که توسط متغیر جریان 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> از سیاست 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 سرور backend طبق مشخصات زیر مسیر خالی نداشته باشد :

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

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

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

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

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

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

منابع

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