500 خطأ في الخادم الداخلي - مسار فارغ

أنت الآن بصدد الاطّلاع على مستندات Apigee Edge.
انتقِل إلى مستندات Apigee X.
info

المشكلة

يتلقّى تطبيق العميل رمز حالة HTTP بقيمة 500 Internal Server Error مع رمز الخطأ protocol.http.EmptyPath كاستجابة لطلبات البيانات من واجهة برمجة التطبيقات.

رسالة الخطأ

يتلقّى تطبيق العميل رمز الاستجابة التالي:

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 فارغ أو مفقود.

السبب الوصف تعليمات تحديد المشاكل وحلّها التي تنطبق على
يحتوي عنوان URL لخادم الخلفية (target.url) على مسار فارغ يحتوي عنوان URL لخادم الخلفية الذي يمثّله متغيّر التدفق target.url على مسار فارغ. مستخدمو Edge Public Cloud وEdge Private Cloud

خطوات التشخيص الشائعة

استخدِم إحدى الأدوات أو التقنيات التالية لتشخيص هذا الخطأ:

API Monitoring

الإجراء 1: استخدام "مراقبة واجهة برمجة التطبيقات"

لتشخيص الخطأ باستخدام "مراقبة واجهة برمجة التطبيقات"، اتّبِع الخطوات التالية:

  1. سجِّل الدخول إلى واجهة مستخدم Apigee Edge بصفتك مستخدمًا لديه دور مناسب.
  2. انتقِل إلى المؤسسة التي تريد التحقيق في المشكلة فيها.

  3. انتقِل إلى صفحة تحليل > مراقبة واجهة برمجة التطبيقات > التحقيق.
  4. اختَر الفترة الزمنية المحدّدة التي لاحظت فيها الأخطاء.
  5. رسم بياني لرمز الخطأ مقابل الوقت

  6. اختَر خلية تحتوي على رمز الخطأ protocol.http.EmptyPath كما هو موضّح أدناه:

  7. تظهر المعلومات حول رمز الخطأ protocol.http.EmptyPath كما هو موضح أدناه:

  8. انقر على عرض السجلات لتوسيع صف الطلب الذي تعذّر تنفيذه.

  9. من نافذة السجلّات، سجِّل التفاصيل التالية:
    • رمز الحالة: 500
    • مصدر الخطأ: target
    • رمز الخطأ: protocol.http.EmptyPath
  10. إذا كان مصدر الخطأ هو target وكان رمز الخطأ هو protocol.http.EmptyPath، يشير ذلك إلى أنّ عنوان URL لخادم الخلفية يتضمّن مسارًا فارغًا.

التتبّع

الإجراء رقم 2: استخدام أداة "التتبُّع"

لتشخيص الخطأ باستخدام "أداة التتبُّع"، اتّبِع الخطوات التالية:

  1. فعِّل جلسة التتبُّع، ثم اتّبِع إحدى الخطوتَين التاليتَين:
    • انتظِر إلى أن يظهر الخطأ 500 Internal Server Error، أو
    • إذا كان بإمكانك إعادة إظهار المشكلة، أرسِل طلب بيانات من واجهة برمجة التطبيقات لإعادة إظهارها 500 Internal Server Error
  2. تأكَّد من تفعيل خيار عرض جميع معلومات FlowInfo:

  3. اختَر أحد الطلبات التي تعذّر تنفيذها وافحص التتبُّع.
  4. تنقَّل بين مراحل التتبُّع المختلفة وحدِّد مكان حدوث الخطأ.
  5. سيظهر الخطأ عادةً في مسار بعد مرحلة بدء مسار الطلب المستهدَف كما هو موضّح أدناه:

  6. دوِّن قيمة الخطأ من التتبُّع.

    error: Request path cannot be empty

    بما أنّ الخطأ يتم طرحه من خلال Apigee Edge بعد مرحلة بدء عملية طلب الاستهداف، يشير ذلك إلى أنّ path في عنوان URL لخادم الخلفية فارغ. من المرجّح أن يحدث ذلك إذا تم تعديل المتغيّر target.url (الذي يمثّل عنوان URL لخادم الخلفية) باستخدام مسار فارغ من خلال إحدى السياسات في مسار الطلب.

  7. افحص القسم المتغيرات التي تمّت قراءتها وتعيينها في كل مسار من الخلف بدءًا من نقطة الخطأ وصولاً إلى مرحلة بدء مسار الطلب المستهدف.
  8. حدِّد السياسة التي يتم فيها تعديل متغيّر التدفق target.url .

    نموذج تتبُّع يعرض سياسة JavaScript التي عدّلت متغيّر التدفق target.url:

    في نموذج التتبُّع الموضّح أعلاه، لاحظ قيمة المتغيّر flow target.url التي تم تعديلها في سياسة JavaScript باسم SetTargetURL على النحو التالي:

    target.url : https://mocktarget.apigee.net
  9. يُرجى العِلم أنّ target.url يتضمّن المكوّنات التالية:
    • النظام: https://mocktarget.apigee.net
    • المسار: فارغ
  10. لذلك، يظهر لك الخطأ Request path cannot be empty.
  11. انتقِل إلى مرحلة AX (تسجيل بيانات "إحصاءات Google") في التتبُّع وانقر عليها.
  12. انتقِل للأسفل إلى قسم تفاصيل المرحلة - عناوين الأخطاء وحدِّد قيمتَي X-Apigee-fault-code وX-Apigee-fault-source كما هو موضّح أدناه:

  13. ستظهر قيمتا X-Apigee-fault-code وX-Apigee-fault-source بالشكلين protocol.http.EmptyPath و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 عبر 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.

    مثال على الخطأ 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 على التوالي، ما يشير إلى أنّ هذا الخطأ ناتج عن أنّ عنوان URL لخادم الخلفية يتضمّن مسارًا فارغًا.

السبب: يحتوي عنوان URL لخادم الخلفية (target.url) على مسار فارغ

التشخيص

  1. حدِّد رمز الخطأ ومصدر الخطأ لـ 500 Internal Server Error باستخدام "مراقبة واجهة برمجة التطبيقات" أو "أداة التتبُّع" أو سجلّات الوصول إلى NGINX كما هو موضّح في خطوات التشخيص الشائعة.
  2. إذا كان رمز الخطأ هو protocol.http.EmptyPath وكان مصدر الخطأ يتضمّن القيمة target، يشير ذلك إلى أنّ عنوان URL لخادم الخلفية يتضمّن مسارًا فارغًا.
  3. يتم تمثيل عنوان URL لخادم الخلفية بواسطة متغيّر التدفق target.url في Apigee Edge. يحدث هذا الخطأ عادةً إذا حاولت تعديل عنوان URL لخادم الخلفية، أي target.url ديناميكيًا باستخدام أي من السياسات (ضمن الخادم الوكيل/التدفق المشترك) في تدفق طلب الخادم المستهدف، بحيث يكون له مسار فارغ.

  4. حدِّد ما إذا كان المتغيّر target.url في مسار التنفيذ يتضمّن مسارًا فارغًا ومصدر قيمته باستخدام إحدى الخطوات التالية:

    التتبّع

    استخدام أداة "التتبُّع"

    إذا كنت قد سجّلت تتبُّعًا لهذا الخطأ، اتّبِع الخطوات الموضّحة في مقالة استخدام أداة التتبُّع ، ثم:

    1. تأكَّد مما إذا كان target.url يتضمّن مسارًا فارغًا.
    2. إذا كانت الإجابة "نعم"، عليك معرفة السياسة التي عدّلت قيمة target.url أو أضافت إليها مسارًا فارغًا.

      نموذج تتبُّع يعرض سياسة JavaScript التي عدّلت متغيّر التدفق target.url:

    3. في نموذج التتبُّع أعلاه، لاحظ أنّ سياسة JavaScript قد عدّلت قيمة target.url أو أضافت إليها مسارًا فارغًا.
    4. يُرجى العِلم أنّ target.url يتضمّن المكوّنات التالية:
      • النظام: https://mocktarget.apigee.net
      • المسار: فارغ

    السجلّات

    استخدام السجلّات في خادم السجلّات

    1. إذا لم يكن لديك سجلّ تتبُّع لهذا الخطأ (مشكلة متقطّعة)، تحقَّق مما إذا كنت قد سجّلت المعلومات حول قيمة متغيّر التدفق target.url، باستخدام سياسات مثل MessageLogging أو ServiceCallout إلى خادم السجلّ.
    2. إذا كانت لديك السجلّات، راجِعها وقم بما يلي:
      1. تحقَّق مما إذا كان target.url يتضمّن مسارًا فارغًا، و
      2. معرفة ما إذا كان بإمكانك تحديد السياسة التي تم تعديلها target.url لتتضمّن مسارًا فارغًا

    خادم وكيل لواجهة برمجة التطبيقات

    مراجعة خادم وكيل واجهة برمجة التطبيقات الذي يتعذّر تنفيذه

    إذا لم يكن لديك تتبُّع أو سجلّات لهذا الخطأ، راجِع خادم وكيل واجهة برمجة التطبيقات الذي تعذّر تنفيذه لتحديد ما تم تعديله أو تحديثه في متغيّر التدفق target.url ليحتوي على مسار غير صالح. تحقق مما يلي:

    • السياسة داخل خادم وكيل لواجهة برمجة التطبيقات
    • أي مسارات مشترَكة يتم استدعاؤها من الخادم الوكيل
  5. افحص السياسة المحدّدة (مثل AssignMessage أو JavaScript) التي تعدّل أو تحدّث متغيّر التدفق target.url بعناية وحدِّد سبب تعديل target.url ليصبح مسارًا فارغًا.

    في ما يلي بعض الأمثلة على السياسات التي تعدّل متغيّر التدفق target.url بشكل غير صحيح ليحتوي على مسار فارغ يؤدي إلى حدوث هذا الخطأ.

    العيّنة رقم 1

    المثال 1: متغيّر target.url لتعديل سياسة JavaScript

    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.

    النموذج رقم 2

    المثال 2: متغيّر target.url لتعديل سياسة JavaScript

    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>
    

    في هذا المثال، لا يتم إرسال مسار العنوان كجزء من الطلب. وبالتالي، تكون قيمة المتغيّر path في سياسة JavaScript هي 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: تعديل متغيّر 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</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>

    يُرجى العِلم أنّ target.url يتضمّن المكوّنات التالية:

    • النظام: https://mocktarget.apigee.net
    • المسار: فارغ

    في جميع الأمثلة أعلاه، يكون المسار في عنوان URL لخادم الخلفية، أي target.url، فارغًا، وبالتالي تعرض Apigee Edge الرمز 500 Internal Server Error مع رمز الخطأ protocol.http.EmptyPath.

الدقة

وفقًا للمواصفات RFC 3986، القسم 2: مكونات البنية، فإنّ المكوّن path هو مكوّن إلزامي ويجب أن يتضمّن دائمًا شرطة مائلة للأمام (/)، حتى إذا لم تكن هناك أحرف أخرى كجزء من path. اتّبِع الخطوات التالية لحلّ هذه المشكلة:

  1. تأكَّد من أنّ عنوان URL لخادم الخلفية، الممثَّل بمتغير التدفق target.url، يتضمّن دائمًا مسارًا غير فارغ.
    1. في بعض الحالات، قد لا يتضمّن المسار اسم مورد، وفي هذه الحالة، احرص على أن يتضمّن المسار شرطة مائلة للأمام (/) على الأقل.
    2. إذا كنت تستخدم أي متغيّرات أخرى لتحديد قيمة متغيّر التدفق target.url، فتأكَّد من أنّ المتغيّرات الأخرى لا تتضمّن مسارًا فارغًا.
    3. إذا أجريت أي عمليات على السلاسل لتحديد قيمة متغيّر التدفق target.url، فتأكَّد من أنّ نتيجة عمليات السلاسل لا تتضمّن مسارًا فارغًا.
  2. في النماذج الموضّحة في التشخيص، يمكنك حلّ هذه المشكلة كما هو موضّح أدناه:

    العيّنة رقم 1

    المثال 1: متغيّر target.url لتعديل سياسة JavaScript

    أضِف شرطة مائلة للأمام (/) إلى المتغيّر url لإصلاح هذه المشكلة كما هو موضّح أدناه:

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

    النموذج رقم 2

    المثال 2: متغيّر target.url لتعديل سياسة JavaScript

    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 للمتغيّر target.url من خلال متغيّر آخر

    أضِف مسارًا صالحًا في العنصر <Value> لسياسة AssignMessage. على سبيل المثال، يمكنك استخدام /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، انتقِل إلى المعلومات التشخيصية التي يجب جمعها.

يجب جمع معلومات التشخيص

إذا استمرت المشكلة حتى بعد اتّباع التعليمات أعلاه، اجمع معلومات التشخيص التالية، ثم تواصَل مع فريق دعم Apigee Edge.

إذا كنت مستخدمًا لخدمة السحابة الإلكترونية العامة، يُرجى تقديم المعلومات التالية:

  • اسم المؤسسة
  • اسم البيئة
  • اسم خادم وكيل لواجهة برمجة التطبيقات
  • أكمِل الأمر curl المستخدَم لإعادة إنتاج 500 Internal Server Error مع رمز الخطأ protocol.http.EmptyPath
  • ملف التتبُّع لطلبات البيانات من واجهة برمجة التطبيقات

إذا كنت مستخدمًا في Private Cloud، يُرجى تقديم المعلومات التالية:

  • رسالة الخطأ الكاملة التي تم رصدها للطلبات التي تعذّر تنفيذها
  • اسم البيئة
  • حِزمة خادم وكيل لواجهة برمجة التطبيقات
  • ملف التتبُّع لطلبات البيانات من واجهة برمجة التطبيقات
  • سجلّات الوصول إلى 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

المراجع

متغيّرات التدفق - الهدف