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

يتم الآن عرض مستندات Apigee Edge.
انتقِل إلى مستندات Apigee X.
المعلومات

المشكلة

يحصل تطبيق العميل على رمز حالة 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 العام والخاص على السحابة الإلكترونية

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

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

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

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

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

  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 لخادم الخلفية يتضمّن مسارًا فارغًا.

التتبّع

الإجراء الثاني: استخدام أداة التتبُّع

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

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

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

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

    خطأ: لا يمكن أن يكون مسار الطلب فارغًا

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

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

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

    في نموذج التتبّع الظاهر أعلاه، لاحظ أنّ قيمة متغيّر التدفق 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. انتقِل للأسفل إلى قسم Stage Details (تفاصيل المرحلة) - Error Headers (عناوين الخطأ) وحدِّد قيمتَي X-Apigee-Error-code وX-Apigee-fulfillment-source كما هو موضّح أدناه:

  13. ستظهر قيمتا X-Apigee-fault-code وX-Apigee-fault-code، على أنّها protocol.http.EmptyPath، وtarget على التوالي، ما يشير إلى أنّ هذا الخطأ حدث بسبب احتواء عنوان URL لخادم الخلفية على مسار فارغ.
    عناوين الاستجابة القيمة
    X-Apigee-fault-code protocol.http.EmptyPath
    X-Apigee-fault-source target

NGINX

الإجراء رقم 3: استخدام سجلات الوصول في NGINX

لتشخيص الخطأ باستخدام سجلات الوصول إلى NGINX:

  1. إذا كنت من مستخدمي السحابة الإلكترونية الخاصة، يمكنك استخدام سجلات وصول NGINX لتحديد المعلومات الأساسية حول HTTP 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 مطابقًا لقيمةX-Apigee-fault-code ، حدِّد قيمة X-Apigee-fault-code

    نموذج الخطأ 500 من سجل وصول NGINX:

    يحتوي إدخال النموذج أعلاه من سجل الوصول إلى NGINX على القيم التالية للسمة X- Apigee-error-code وX-Apigee-Error-source:.

    العناوين القيمة
    X-Apigee-fault-code protocol.http.EmptyPath
    X-Apigee-fault-source target

    لاحِظ أنّ قيمتَي X-Apigee-fault-code وX-Apigee-fault-code هما protocol.http.EmptyPath وtarget على التوالي، ما يشيران إلى أنّ هذا الخطأ حدث بسبب احتواء عنوان URL لخادم الخلفية على X-Apigee-fault-code.

السبب: يحتوي عنوان 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 لتتضمّن مسارًا فارغًا.

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

    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: تعديل سياسة JavaScript لمتغيّر 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.

    النموذج الثاني

    النموذج 2: تعديل سياسة JavaScript لمتغيّر 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>
    

    في هذا المثال، لا يتم إرسال مسار العنوان كجزء من الطلب. وبالتالي، تكون قيمة المسار المتغيّر في سياسة 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: سياسة 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 لخادم الخلفية، وهو 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: تعديل سياسة JavaScript لمتغيّر target.url

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

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

    النموذج الثاني

    النموذج 2: تعديل سياسة JavaScript لمتغيّر 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: سياسة 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.

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

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

إذا كنت مستخدم 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

المراجع

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