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 בתור משתמשים עם תפקיד מתאים.
  2. עוברים לארגון שבו רוצים לבדוק את הבעיה.

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

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

  9. לוחצים על View Logs (הצגת היומנים) ומרחיבים את השורה של הבקשה שנכשלה.
  10. בחלון Logs, שימו לב לפרטים הבאים:
    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 Access כוללת את הערכים הבאים עבור X-Apigee- fault-code ו-X-Apigee-fault-source:

    כותרות תגובה Value
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source MP

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

אבחון

  1. מאתרים את קוד התקלה ואת מקור התקלה של השגיאה שזוהתה באמצעות יומני API Monitoring או יומני הגישה של NGINX, כמו שמוסבר בשלבים הנפוצים לאבחון.
  2. אם ל-Fault Source יש את הערך 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> ,שמאפשר לאפליקציות לקוח ולשרתי יעד לשלוח כותרות כפולות לשרתי API של API ב-Apigee Edge.

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

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

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

מפרט

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

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

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

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

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

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

  • שם הארגון
  • שם הסביבה
  • שם שרת proxy ל-API
  • צריך להשלים את הפקודה 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