502 مدخل غير صالح - رأس الصفحة مكرر

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

المشكلة

يتلقّى تطبيق العميل رمز حالة HTTP هو 502 Bad Gateway مع رمز الخطأ protocol.http.DuplicateHeader كاستجابة لطلبات البيانات من واجهة برمجة التطبيقات.

رسالة الخطأ

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

HTTP/1.1 502 Bad Gateway

بالإضافة إلى ذلك، قد تظهر لك رسالة خطأ مشابهة للرسالة الموضحة أدناه:

{
   "fault":{
      "faultstring":"Duplicate Header \"Expires\"",
      "detail":{
         "errorcode":"protocol.http.DuplicateHeader"
      }
   }
}

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

يحدث هذا الخطأ إذا ظهر رأس HTTP معيّن أكثر من مرة بقيم متطابقة أو مختلفة، كجزء من استجابة HTTP التي يرسلها خادم الخلفية إلى Apigee Edge، مع العلم أنّه لا يُسمح بأن يتضمّن هذا الرأس نسخًا مكرّرة في Apigee Edge.

وفقًا للقسم 3.2.2: ترتيب الحقول من RFC 7230، يجب ألا يُنشئ المُرسِل حقول رؤوس متعددة لها اسم الحقل نفسه في رسالة ما، إلا إذا تم تحديد قيمة الحقل بالكامل لهذا الحقل على أنّها قائمة قيم مفصولة بفاصلة، [أي #(values)] أو إذا كان حقل الرأس استثناءً معروفًا. إذا وجد Apigee Edge أنّ رأسًا معيّنًا لا يُسمح بأن يتضمّن نسخًا مكرّرة، وتم إرساله أكثر من مرة في استجابة HTTP التي يرسلها الخادم المستهدف أو خادم الخلفية، فإنّه يستجيب برمز الحالة 502 Bad Gateway ورمز الخطأ protocol.http.DuplicateHeader

في ما يلي الأسباب المحتمَلة لهذا الخطأ:

السبب الوصف تعليمات تحديد المشاكل وحلّها التي تنطبق على
رأس مكرّر في الاستجابة تحتوي الاستجابة من خادم الخلفية على رؤوس مكرّرة. مستخدمو السحابة الإلكترونية العامة والخاصة في Edge

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

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

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

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

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

  3. انتقِل إلى صفحة تحليل > مراقبة واجهة برمجة التطبيقات > التحقيق.
  4. اختَر الإطار الزمني المحدّد الذي لاحظت فيه الأخطاء.
  5. تأكَّد من ضبط فلتر الخادم الوكيل على الكل.
  6. ارسِم رمز الخطأ مقابل الوقت.
  7. اختَر خلية تحتوي على رمز الخطأ protocol.http.DuplicateHeader كما هو موضّح أدناه:

    (عرض صورة أكبر)

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

    (عرض صورة أكبر)

  9. تأكَّد من أنّ رمز الحالة هو 502 كما هو موضّح في المثال أعلاه.
  10. انقر على عرض السجلّات ووسِّع صف الطلب الذي تعذّر تنفيذه.
  11. من نافذة "السجلّات"، دوِّن التفاصيل التالية:

    • رمز الحالة: 502
    • مصدر الخطأ: target
    • رمز الخطأ: protocol.http.DuplicateHeader.
  12. إنّ مصدر الخطأ هو target، ما يشير إلى أنّ الاستجابة من خادم الخلفية كانت تحتوي على رؤوس مكرّرة.

أداة التتبُّع

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

  1. فعِّل جلسة التتبُّع وقم بأحد الإجراءَين التاليَين:
    1. انتظِر حدوث الخطأ 502 Bad Gateway أو
    2. إذا كان بإمكانك إعادة إنتاج المشكلة، نفِّذ طلب بيانات من واجهة برمجة التطبيقات وأعِد إنتاج الخطأ 502 Bad Gateway
  2. تأكَّد من تفعيل الخيار عرض جميع معلومات التدفق:

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

    (عرض صورة أكبر)

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

    يعرض نموذج التتبُّع أعلاه الخطأ على أنّه Duplicate Header "Expires". بما أنّ Apigee هو من أثار الخطأ بعد إرسال الطلب إلى خادم الخلفية، يشير ذلك إلى أنّ خادم الخلفية أرسل الرأس Expires أكثر من مرة.

  7. انتقِل إلى مرحلة AX (بيانات الإحصاءات المسجّلة) في التتبُّع وانقر عليها.
  8. انتقِل للأسفل إلى قسم تفاصيل المرحلة - رؤوس الاستجابة وحدِّد قيمتَي X-Apigee-fault-code وX-Apigee-fault-source كما هو موضّح أدناه:

    (عرض صورة أكبر)

  9. ستظهر لك قيمتا X-Apigee-fault-code وX-Apigee-fault-source على أنّهما protocol.http.DuplicateHeader وtarget، ما يشير إلى أنّ هذا الخطأ ناتج عن إرسال خادم الخلفية رؤوسًا مكرّرة لعنوان الاستجابة Expires.
    عناوين الاستجابة القيمة
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target
  10. تحقَّق مما إذا كنت تستخدم تسلسل الخوادم الوكيلة؛ أي إذا كان الخادم المستهدف أو نقطة النهاية المستهدَفة يستدعيان خادمًا وكيلاً آخر في Apigee.

    1. لتحديد ذلك، انتقِل مرة أخرى إلى مرحلة الطلب المُرسَل إلى الخادم المستهدف. انقر على عرض أمر curl.

    2. تُفتح نافذة أمر curl للطلب المُرسَل إلى الخادم المستهدف التي يمكنك من خلالها تحديد الاسم المستعار لمضيف الخادم المستهدف.

    3. إذا كان الاسم المستعار لمضيف الخادم المستهدف يشير إلى اسم مستعار لمضيف افتراضي، يكون ذلك تسلسلاً للخوادم الوكيلة. في هذه الحالة، عليك تكرار جميع الخطوات أعلاه للخادم الوكيل المتسلسل إلى أن تحدّد السبب الفعلي للخطأ 502 Bad Gateway.
    4. إذا كان الاسم المستعار لمضيف الخادم المستهدف يشير إلى خادم الخلفية، يشير ذلك إلى أنّ خادم الخلفية يرسل الرؤوس المكرّرة في الاستجابة إلى Apigee.

NGINX

لتشخيص الخطأ باستخدام سجلّات الوصول إلى NGINX، اتّبِع الخطوات التالية:

  1. إذا كنت مستخدمًا للسحابة الإلكترونية الخاصة، يمكنك استخدام سجلّات الوصول إلى NGINX لـ تحديد المعلومات الرئيسية حول أخطاء HTTP 502.
  2. راجِع سجلّات الوصول إلى NGINX:

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

    ملاحظة: يتم استبدال ORG وENV وPORT# بالقيم الفعلية.

  3. ابحث لمعرفة ما إذا كانت هناك أي أخطاء 502 خلال مدة معيّنة (إذا حدثت المشكلة في الماضي) أو إذا كانت هناك أي طلبات لا تزال تتعذّر مع ظهور الخطأ 502.
  4. إذا عثرت على أي أخطاء 502 وكان X-Apigee-fault-code يطابق قيمة protocol.http.DuplicateHeader، فحدِّد قيمة X-Apigee-fault-source.

    نموذج لخطأ 502 من سجلّ الوصول إلى NGINX:

    يحتوي الإدخال النموذجي أعلاه من سجلّ الوصول إلى NGINX على القيمتَين التاليتَين لـ X- Apigee-fault-code وX-Apigee-fault-source:

    عناوين الاستجابة القيمة
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target

السبب: رأس مكرّر في الاستجابة

التشخيص

  1. حدِّد رمز الخطأ ومصدر الخطأ للخطأ الذي تم رصده باستخدام "مراقبة واجهة برمجة التطبيقات" أو سجلّات الوصول إلى NGINX كما هو موضّح في الخطوات الشائعة لتشخيص المشكلة.
  2. إذا كانت قيمة مصدر الخطأ هي target، يشير ذلك إلى أنّ الاستجابة التي أرسلها الخادم المستهدف تحتوي على رؤوس مكرّرة.
  3. يمكنك تحديد الرأس الفعلي الذي تم إرساله أكثر من مرة كجزء من الاستجابة باستخدام إحدى الطريقتَين التاليتَين:

    رسالة الخطأ

    باستخدام رسالة الخطأ:

    1. إذا كان بإمكانك الوصول إلى رسالة الخطأ الكاملة التي تم تلقّيها من Apigee Edge، يُرجى الرجوع إلى faultstring. يحتوي faultstring على اسم الرأس الذي تم إرساله أكثر من مرة.

      نموذج لرسالة الخطأ:

      "faultstring":"Duplicate Header \"Expires\""
    2. في رسالة الخطأ أعلاه، يمكنك ملاحظة أنّه تم إرسال الرأس Expires أكثر من مرة كما هو موضّح في faultstring.

    الطلب الفعلي

    باستخدام الطلب الفعلي:

    1. إذا لم يكن بإمكانك الوصول إلى الطلب الفعلي الذي تم إرساله إلى الخادم المستهدف، احصل على أمر curl المقابل من الخطوة 10.أ والخطوة 10.ب في مقالة استخدام "أداة التتبُّع".
    2. إذا كان بإمكانك الوصول إلى الطلب الفعلي الذي تم إرساله إلى تطبيق الخادم المستهدف، اتّبِع الخطوات التالية:

      1. أجرِ مكالمة إلى الخادم المستهدف.

        نموذج للطلب المُرسَل إلى الخادم المستهدف المستخدَم في هذا المثال:

        curl -X GET "https://BACKEND_SERVER_HOST/response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT" -v
        
      2. تحقَّق من قائمة الرؤوس التي تظهر في الاستجابة.

        نموذج للاستجابة من الخادم المستهدف المستخدَم في هذا المثال:

        * ...Trimmed...
        > GET /response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT HTTP/2
        > Host: BACKEND_SERVER_HOST
        > User-Agent: curl/7.64.1
        > Accept: */*
        >
        * Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
        < HTTP/2 200
        < date: Fri, 02 Jul 2021 05:29:07 GMT
        < content-type: application/json
        < content-length: 166
        < server: gunicorn/19.9.0
        < Expires: Mon, 21 June 2021 07:28:00 GMT
        < Expires: Mon, 21 June 2021 07:28:00 GMT
        < access-control-allow-origin: *
        < access-control-allow-credentials: true
        <
        ----<Response BODY>------
        * Connection #0 to host httpbin.org left intact
        * Closing connection 0

        في طلب المثال أعلاه، تم إرسال الرأس Expires أكثر من مرة. لذلك، يتعذّر تنفيذ هذا الطلب مع ظهور الخطأ 502 Bad Gateway ورمز الخطأ: protocol.http.DuplicateHeader.

      3. إذا ظهر الرأس الذي يظهر اسمه في faultstring أكثر من مرة في استجابة خادم الخلفية، يكون ذلك هو سبب هذا الخطأ. في الحالة أعلاه، تم إرسال الرأس Expires أكثر من مرة.

الدقة

إصلاح التكرار

الخيار 1 [الخيار المُقترَح]: إصلاح خادم الخلفية لعدم تضمين رؤوس مكرّرة

  1. حلِّل سبب إرسال خادم الخلفية المحدّد للرأس المكرّر Expires وتأكَّد مما إذا كان من المقبول أن تقبل الخوادم الوكيلة لواجهة برمجة التطبيقات ذلك. في معظم الحالات، لن يكون ذلك مرغوبًا فيه وفقًا لمواصفات HTTP في RFC7230.
  2. إذا لم يكن ذلك مرغوبًا فيه، عدِّل تطبيق الخادم المستهدف لكي لا يرسل رؤوسًا مكرّرة. في المثال الذي تمت مناقشته أعلاه، يُلاحَظ أنّه تم إرسال الرأس Expires مرّتَين بالقيمة نفسها، وهو أمر غير مرغوب فيه. يمكنك حلّ المشكلة من خلال التأكّد من أنّ الخادم المستهدف يمرِّر الرأس Expires مرة واحدة فقط.
  3. إذا كان ذلك مرغوبًا فيه وأردت السماح بالرؤوس المكرّرة، انتقِل إلى الخيار 2: استخدام خاصية CwC.

CwC

الخيار 2: استخدام خاصية CwC

توفر Apigee خاصية CwC HTTPHeader.<HeaderName> ،التي تسمح لتطبيقات العملاء والخوادم المستهدفة بإرسال رؤوس مكررة إلى الخوادم الوكيلة لواجهة برمجة التطبيقات في Apigee Edge.

خاصية CwC القيم
HTTPHeader.<HeaderName> allowDuplicates,multivalued

على سبيل المثال، يمكن ضبط الخاصية التالية على "معالجات الرسائل" للسماح بالنسخ المكرّرة والقيم المتعددة للرأس Expires.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. إذا كنت مستخدمًا للسحابة الإلكترونية الخاصة، يمكنك ضبط الخاصية لمنع Apigee Edge من إظهار الخطأ 502 Bad Gateway، حتى إذا كان الطلب يحتوي على رؤوس مكرّرة، وذلك باستخدام دليل الإجراءات كيفية ضبط "معالجات الرسائل" لاستخدام رؤوس مكرّرة.
  2. إذا كنت مستخدمًا للسحابة الإلكترونية العامة، يُرجى التواصل مع فريق دعم Apigee Edge لضبط هذه الخاصية لمؤسستك.

المواصفات

يستجيب Apigee برمز الاستجابة للخطأ 502 Bad Gateway لأنّه يتوقّع أن يتصرف خادم الخلفية وفقًا لمواصفات RFC التالية:

المواصفات
RFC 7230، القسم 3.2.2: ترتيب الحقول
RFC 7230، القسم 3.2: حقول الرأس

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

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

اجمع معلومات التشخيص التالية، ثم تواصَل مع فريق دعم Apigee Edge.

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

  • اسم المؤسسة
  • اسم البيئة
  • اسم الخادم الوكيل لواجهة برمجة التطبيقات
  • أمر curl الكامل المستخدَم لإعادة إنتاج الخطأ 502
  • ملف التتبُّع لطلبات البيانات من واجهة برمجة التطبيقات

إذا كنت مستخدمًا للسحابة الإلكترونية الخاصة ، قدِّم المعلومات التالية:

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