400 Bad Request - DuplicateHeader

מוצג המסמך של Apigee Edge.
עוברים אל מסמכי תיעוד של Apigee X.
מידע

תיאור הבעיה

אפליקציית הלקוח מקבלת קוד סטטוס HTTP של 400 Bad Request עם קוד שגיאה protocol.http.DuplicateHeader כתגובה לקריאות ל-API.

הודעת שגיאה

אפליקציית הלקוח מקבלת את קוד התגובה הבא:

HTTP/1.1 400 Bad Request

בנוסף, יכול להיות שתופיע הודעת שגיאה דומה להודעה שמוצגת בהמשך:

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

גורמים אפשריים

השגיאה הזו מתרחשת אם לכותרת HTTP ספציפית אסור שיהיו כפילויות ב-Apigee Edge, מופיע יותר מפעם אחת עם ערכים זהים או שונים כחלק מבקשת ה-HTTP שנשלחה על ידי הלקוח ב-Apigee Edge.

לפי RFC 7230, סעיף 3.2.2: סדר שדות, אסור ששולח ייצור כמה כותרות שדות עם שם שדה זהה בהודעה, אלא אם ערך השדה כולו שדה הכותרת מוגדר כרשימה שמופרדת בפסיקים, [כלומר, #(values)] או ששדה הכותרת הוא חריגה ידועה. אם Apigee Edge מוצאת כותרת ספציפית, אסור שתהיה כפילויות, יותר מפעם אחת בבקשת ה-HTTP שנשלחה על ידי הלקוח, ואז עם קוד השגיאה 400 Bad Request וקוד השגיאה protocol.http.DuplicateHeader.

אלה הסיבות האפשריות לשגיאה הזו:

סיבה תיאור הוראות לפתרון בעיות עבור
כפילות בכותרת בבקשה בקשת ה-HTTP מאפליקציית הלקוח ל-Apigee מכילה כותרות כפולות. משתמשי Edge בענן הציבורי והפרטי

שלבי אבחון נפוצים

יש להשתמש באחד מהכלים או השיטות הבאים כדי לאבחן את השגיאה:

מעקב API

כדי לאבחן את השגיאה באמצעות API Monitoring:

  1. נכנסים ל-Apigee Edge UI כמשתמש עם תפקיד מתאים.
  2. עוברים לארגון שבו רוצים לחקור את הבעיה.

  3. מנווטים אל ניתוח > מעקב API > לחקור את הדף.
  4. בוחרים את מסגרת הזמן הספציפית שבה הבחנתם בשגיאות.
  5. מוודאים שמסנן שרת ה-proxy מוגדר ל-All.
  6. הציגו את קוד התקלה ביחס ל-Time.
  7. צריך לבחור תא עם קוד השגיאה protocol.http.DuplicateHeader כפי שמוצג בהמשך:

  8. מידע על קוד התקלה protocol.http.DuplicateHeader הוא מוצגת כפי שמוצג כאן:

  9. לוחצים על הצגת היומנים ומרחיבים את השורה של הבקשה שנכשלה.
  10. בחלון יומנים שימו לב לפרטים הבאים:
    1. קוד סטטוס: 400
    2. מקור התקלה: apigee
    3. קוד התקלה: protocol.http.DuplicateHeader.
  11. אם ל-Fault Source יש את הערך apigee או MP , ול-Fault Code יש ערך protocol.http.DuplicateHeader, אז מציין שבקשת ה-HTTP מ- הלקוח הכיל כותרות כפולות.

כלי המעקב

NGINX

כדי לאבחן את השגיאה באמצעות יומני הגישה של NGINX:

  1. אם אתם משתמשים של ענן פרטי, אתם יכולים להשתמש ביומני הגישה ל-NGINX כדי להבין את המידע העיקרי על שגיאות HTTP 400.
  2. בודקים את יומני הגישה ל-NGINX:

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

    איפה: ORG, ENV ו-PORT# מוחלפים ב: והערכים בפועל.

  3. מחפשים אם יש שגיאות 400 במהלך פרק זמן ספציפי (אם שאירעה בעבר) או אם יש בקשות שעדיין לא נענו 400
  4. אם מופיעות שגיאות 400 בקוד X-Apigee-fault-code תואם לערך של protocol.http.DuplicateHeader, אז לקבוע את הערך של X-Apigee-fault-source.

    דוגמה לשגיאה 400 מיומן הגישה ל-NGINX:

    הרשומה לדוגמה שלמעלה מיומן הגישה של NGINX כוללת את הערכים הבאים עבור X-Apigee- קוד שגיאה ו-X-Apigee-fault-source:

    כותרות של תשובות ערך
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source MP

הסיבה: הבקשה מכילה כותרת כפולה

אבחון

  1. מגדירים את קוד השגיאה ואת מקור התקלה של השגיאה שזוהתה באמצעות ה-API יומני מעקב או יומני גישה ל-NGINX, כמו שמוסבר בשלבי האבחון הנפוצים.
  2. אם מקור התקלה מכיל את הערך apigee או MP, הערך הזה מציין שהבקשה שנשלחה על ידי אפליקציית הלקוח ל-Apigee מכילה כפילות כותרות עליונות.
  3. אפשר לקבוע מה הכותרת בפועל שנשלחת יותר מפעם אחת כחלק מהבקשה באמצעות אחת מהשיטות הבאות:

    הודעת שגיאה

    שימוש בהודעת השגיאה

    1. אם יש לכם גישה להודעת השגיאה המלאה שהתקבלה מ-Apigee Edge, יש לעיין בfaultstring. השדה faultstring מכיל את הערך שם הכותרת שנשלח יותר מפעם אחת.

      הודעת שגיאה לדוגמה:

      "faultstring":"Duplicate Header \"Expires\""
      
    2. בהודעת השגיאה שלמעלה, ניתן לראות שהכותרת Expires היא נשלח יותר מפעם אחת כפי שמוצג בfaultstring.

    הבקשה בפועל

    באמצעות הבקשה בפועל

    1. אם יש לכם גישה לבקשה שנשלחה בפועל על ידי אפליקציית הלקוח, אז: מבצעים את השלבים הבאים:

      1. מאמתים את רשימת הכותרות שהועברו בבקשה.
      2. אם גיליתם שכותרת מסוימת מופיעה יותר מפעם אחת בקשה עם אותו ערך או עם ערכים שונים , זו הסיבה בנוגע לשגיאה הזו.

      בקשה לדוגמה:

      curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT" -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
      

      בבקשה לדוגמה שלמעלה, הכותרת Expires נשלחת יותר מ- פעם אחת. לכן, הבקשה הזו נכשלת עם השגיאה 400 Bad Request קוד השגיאה: protocol.http.DuplicateHeader.

    2. לחלופין, אם יש לכם גישה ליומני הלקוח, אתם יכולים לבדוק מידע על הבקשה שנשלחה בפועל ל-Apigee Edge ולקבוע את הכותרת נשלח יותר מפעם אחת.

רזולוציה

תיקון כפילויות

אפשרות מס' 1 [אפשרות מומלצת] תיקון אפליקציית הלקוח כך שלא תכלול כותרות כפולות

  1. ניתוח הסיבה שבגללה הלקוח הספציפי שלח כותרת כפולה. לדוגמה, Expires במקרה שלמעלה. אימות ששרתי ה-proxy ל-API יכולים לקבל אותו את הכותרת הכפולה. בדרך כלל, זה לא רצוי לפי מפרט HTTP RFC7230.
  2. אם לא רצוי, משנים את אפליקציית הלקוח כך שלא תשלח כותרות כפולות.

    בדוגמה שצוינה למעלה, ניתן לראות שהכותרת Expires נשלחת פעמיים עם אותו ערך, שאינו רצוי. כדי לפתור את הבעיה, מעבירים את הכותרת Expires פעם אחת בלבד כפי שמוצג למטה:

    curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
    
  3. אם הוא רצוי ואתם רוצים להתיר את הכותרות הכפולות, עוברים אל אפשרות 2 באמצעות נכס CwC.

CwC

אפשרות 2 באמצעות נכס CwC

Apigee מספקת נכס CwC HTTPHeader.<HeaderName> ,שמאפשר ללקוח לאפליקציות ולשרתי יעד לשלוח כותרות כפולות לשרתי proxy ל-API ב-Apigee Edge.

נכס CwC ערכים
HTTPHeader.<HeaderName> allowDuplicates,multivalued

לדוגמה, אפשר להגדיר את המאפיין הבא במעבדי ההודעות כדי לאפשר כפילויות ביותר ערכים עבור הכותרת Expires.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. אם אתם משתמשים בענן פרטי, תוכלו להגדיר את הנכס כדי למנוע Apigee Edge מהעלאת שגיאת 400 Bad Request, גם אם הבקשה מכיל כותרות כפולות שמשתמשות ברכיב מגדירים את מעבדי ההודעות לשימוש בכותרות כפולות.
  2. אם אתם משתמשים בענן ציבורי, עליכם לפנות לתמיכה של Apigee Edge כדי להגדיר את הנכס הזה לארגון שלך.

מפרט

Apigee מצפה שאפליקציית הלקוח לא תשלח כותרות כפולות כחלק מהבקשה בהתאם למפרטי ה-RFC הבאים:

מפרט
RFC 7230, סעיף 3.2.2: סדר שדות
RFC 7230, סעיף 3.2 שדות כותרת

אם עדיין דרושה לך עזרה מהתמיכה של Apigee, אפשר לעבור אל חובה לאסוף את פרטי האבחון.

חובה לאסוף פרטי אבחון

עליכם לאסוף את פרטי האבחון הבאים ואז לפנות לתמיכה של Apigee Edge.

אם אתם משתמשים ב-Public Cloud, עליכם לספק את הפרטים הבאים:

  • שם הארגון
  • שם הסביבה
  • שם ה-API של ה-Proxy
  • צריך להשלים את הפקודה curl ששימשה לשחזור השגיאה 400
  • קובץ מעקב אחר בקשות ה-API

אם אתם משתמשים בענן פרטי, עליכם לספק את הפרטים הבאים:

  • הודעת שגיאה מלאה שנצפתה בבקשות שנכשלו
  • שם הסביבה
  • חבילת proxy ל-API
  • צריך להשלים את פקודת curl שבה השתמשת כדי לשחזר את השגיאה 400
  • קובץ מעקב אחר בקשות ה-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