500 خطأ في الخادم الداخلي - BadPath

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

المشكلة

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

رسالة الخطأ

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

HTTP/1.1 500 Internal Server Error

بالإضافة إلى ذلك، قد تلاحظ رسالة الخطأ التالية:

{
   "fault":{
      "faultstring":"Invalid request path",
      "detail":{
         "errorcode":"protocol.http.BadPath"
      }
   }
}

الأسباب المحتملة

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

وفقًا لمواصفات 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.BadPath.

على سبيل المثال: إذا كانت السمة target.url تتضمّن القيمة https://www.mocktarget.apigee.net?json، يحدث هذا الخطأ عندما يتبين أنّ path غير صالحة، لأنّها تبدأ بعلامة استفهام (?) بدلاً من شرطة مائلة للأمام (/).

السبب الوصف تعليمات تحديد المشاكل وحلّها السارية على
عنوان URL لخادم الخلفية (target.url) يتضمّن مسارًا غير صالح يبدأ مكوِّن المسار في عنوان URL لخادم الخلفية الذي يتم تمثيله بمتغير التدفق target.url بعلامة استفهام (?) بدلاً من شرطة مائلة للأمام (/). مستخدمو Edge العام والخاص على السحابة الإلكترونية

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

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

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

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

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

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

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

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

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

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

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

التتبّع

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

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

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

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

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

    خطأ: مسار الطلب غير صالح

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

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

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

    في نموذج تتبُّع النموذج الموضّح أعلاه، لاحظ أنّه تم تعديل قيمة متغيّر التدفق target.url في سياسة JavaScript باسم JS- SetTargetURL على النحو التالي: target.url : https://mocktarget.apigee.net?json

  9. يُرجى العلم أنّ القيمة في target.url تتضمّن المكوّنات التالية:
    • المخطّط: https
    • السلطة: mocktarget.apigee.net
    • المسار: ?json
  10. بما أنّ مكوِّن path يبدأ بعلامة استفهام (?) بدلاً من شرطة مائلة للأمام (/)، ستظهر لك رسالة الخطأ Invalid request path.
  11. انتقِل إلى مرحلة AX (بيانات "إحصاءات Google" المسجّلة) في التتبُّع وانقر عليها.
  12. انتقِل للأسفل إلى قسم Stage Details (تفاصيل المرحلة) - Error Headers (عناوين الخطأ) وحدِّد قيمتَي X-Apigee-Error-code وX-Apigee-fulfillment-source كما هو موضّح أدناه:

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

    عناوين الاستجابة القيمة
    X-Apigee-fault-code protocol.http.BadPath
    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.BadPath خلال مدة معيّنة (إذا حدثت المشكلة في الماضي) أو لمعرفة ما إذا كانت هناك أي طلبات لا تزال يتعذّر تنفيذها مع 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.BadPath
    X-Apigee-fault-source target

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

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

التشخيص

  1. حدِّد رمز الخطأ ومصدر الخطأ لـ 500 Internal Server Error باستخدام مراقبة واجهة برمجة التطبيقات أو أداة التتبُّع أو سجلات الوصول إلى NGINX كما هو موضّح في خطوات التشخيص الشائعة.
  2. إذا كان رمز الخطأ هو protocol.http.BadPath وكانت القيمة 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
      • المسار: ?json

      يبدأ المسار بعلامة استفهام (?) بدلاً من شرطة مائلة للأمام (/)، وبالتالي فهو غير صالح.

    السجلّات

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

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

    في النموذج أعلاه، لاحِظ أنّه تم تعديل متغير التدفق target.url بالقيمة https://mocktarget.apigee.net?json المضمّنة في متغيّر آخر url..

    تجدر الإشارة إلى أنّ قيمة url تتضمّن المكوّنات التالية:

    • المخطّط: https
    • السلطة: mocktarget.apigee.net
    • المسار: ?json

    يبدأ المسار بعلامة استفهام (?) بدلاً من الشرطة المائلة للأمام (/)، وهي علامة غير صالحة. لذلك، تعرض Apigee Edge 500 Internal Server Error مع رمز الخطأ protocol.http.BadPath.

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

    النموذج 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> -H "Path: ?user"
    

    في هذا المثال، لا يتم إرسال مسار العنوان كجزء من الطلب. وبالتالي، تكون قيمة المتغيّر path في سياسة JavaScript هي null.

    وبالتالي:

    • url = https://mocktarget.apigee.net + path
    • url = https://mocktarget.apigee.net + "?user"
    • target.url = https://mocktarget.apigee.net?user

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

    • المخطّط: https
    • السلطة: mocktarget.apigee.net
    • المسار: ?user

    يبدأ المسار بعلامة استفهام (?) بدلاً من الشرطة المائلة للأمام (/)، وهي علامة غير صالحة. وبالتالي، تعرض Apigee Edge 500 Internal Server Error برمز الخطأ protocol.http.BadPath.

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

    النموذج رقم 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?echo</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

    تجدر الإشارة إلى أنّ قيمة url تتضمّن المكوّنات التالية:

    • المخطّط: https
    • السلطة: mocktarget.apigee.net
    • المسار: ?echo

    مجددًا في هذا المثال، يبدأ المسار بعلامة استفهام (?) بدلاً من الشرطة المائلة للأمام (/)، وهي علامة غير صالحة. لذلك، تعرض Apigee Edge 500 Internal Server Error برمز الخطأ protocol.http.BadPath.

درجة الدقّة

وفقًا لمواصفات عنوان URL RFC 3986، القسم 3: مكوّنات البنية، يكون المكوِّن path مطلوبًا ويجب أن يبدأ دائمًا بالرمز "/". لذلك عليك اتّباع الخطوات التالية لحلّ هذه المشكلة:

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

    النموذج الأول

    النموذج 1: تعديل سياسة JavaScript لمتغيّر target.url

    استخدِم شرطة مائلة للأمام (/) بدلاً من علامة الاستفهام (?) في المتغيّر url لحلّ هذه المشكلة كما هو موضّح أدناه:

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

    تأكَّد من اجتياز مسار صالح، على سبيل المثال: /user كجزء من عنوان الطلب Path، لحلّ هذه المشكلة على النحو الموضّح أدناه:

    نموذج طلب:

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

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

    النموذج رقم 3: سياسة AssignMessage تعديل متغيّر target.url

    أضِف مسارًا صالحًا في العنصر <Value> في سياسة AssignMessage. ويعني ذلك استبدال علامة الاستفهام (?) بشرطة مائلة للأمام (/) في العنصر <Value> وضبطها على https://mocktarget.apigee.net/echo لحلّ هذه المشكلة على النحو الموضّح أدناه:

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

    المواصفات

    يتوقع Apigee Edge أن path المكوِّن في عنوان URL لخادم الخلفية يجب أن يبدأ دائمًا بشرطة مائلة للأمام (/) وفقًا للمواصفات التالية:

    المواصفات
    RFC 3986، القسم 3: مكوّنات البنية
    RFC 3986، القسم 3.3: المسار

    إذا كنت لا تزال بحاجة إلى أي مساعدة من فريق دعم Apigee، يُرجى الانتقال إلى ضرورة جمع معلومات التشخيص.

    ضرورة جمع معلومات التشخيص

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

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

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

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

    المراجع

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