אתם צופים במסמכי התיעוד של 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 Public Cloud וב-Edge Private Cloud |
שלבים נפוצים לאבחון
כדי לאבחן את השגיאה הזו, אפשר להשתמש באחד מהכלים או מהטכניקות הבאים:
API Monitoring
כדי לאבחן את השגיאה באמצעות הכלי 'מעקב אחר API':
- נכנסים לממשק המשתמש של Apigee Edge בתור משתמש עם תפקיד מתאים.
עוברים לארגון שבו רוצים לבדוק את הבעיה.

- עוברים לדף Analyze > API Monitoring > Investigate.
- בוחרים את מסגרת הזמן הספציפית שבה נתקלת בשגיאות.
- מוודאים שהמסנן Proxy מוגדר לAll.
- משרטטים את קוד התקלה מול הזמן.
בוחרים תא עם קוד השגיאה
protocol.http.DuplicateHeaderכמו בדוגמה הבאה:
המידע על קוד התקלה
protocol.http.DuplicateHeaderמוצג כמו בדוגמה הבאה:
- לוחצים על הצגת יומנים ומרחיבים את השורה של הבקשה שנכשלה.
- בחלון יומנים, רושמים את הפרטים הבאים:
- קוד סטטוס:
400 - מקור התקלה:
apigee - קוד שגיאה:
protocol.http.DuplicateHeader.
- קוד סטטוס:
- אם הערך של Fault Source הוא
apigeeאוMPוהערך של Fault Code הואprotocol.http.DuplicateHeader, המשמעות היא שבקשת ה-HTTP מהלקוח הכילה כותרות כפולות.
כלי המעקב
NGINX
כדי לאבחן את השגיאה באמצעות יומני הגישה של NGINX:
- אם אתם משתמשי Private Cloud, אתם יכולים להשתמש ביומני הגישה של NGINX כדי לקבוע את פרטי המפתח לגבי שגיאות HTTP
400. בודקים את יומני הגישה של NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logהערה: מחליפים את ORG, ENV ו-PORT# בערכים האמיתיים.
- מחפשים כדי לראות אם יש
400שגיאות במהלך פרק זמן מסוים (אם הבעיה התרחשה בעבר) או אם יש בקשות שעדיין נכשלות עם400. אם מופיעות שגיאות
400עם הערך של X-Apigee-fault-code שזהה לערך שלprotocol.http.DuplicateHeader, צריך לקבוע את הערך של X-Apigee-fault-source.דוגמה לשגיאה 400 מיומן הגישה של NGINX:
בדוגמה שלמעלה מתוך יומן הגישה של NGINX, הערכים של X-Apigee- fault-code ושל X-Apigee-fault-source: הם:
כותרות תגובה ערך X-Apigee-fault-code protocol.http.DuplicateHeaderX-Apigee-fault-source MP
הסיבה: כותרת כפולה בבקשה
אבחון
- כדי לזהות את קוד השגיאה ואת מקור השגיאה של השגיאה שנצפתה, אפשר להשתמש ב'מעקב אחר קריאות ל-API' או ביומני הגישה של NGINX, כמו שמוסבר בשלבים הנפוצים לאבחון.
- אם הערך של Fault Source הוא
apigeeאוMP, המשמעות היא שהבקשה שנשלחה מאפליקציית הלקוח אל Apigee מכילה כותרות כפולות. כדי לראות את הכותרת בפועל שנשלחת יותר מפעם אחת כחלק מהבקשה, אפשר להשתמש באחת מהשיטות הבאות:
הודעת שגיאה
איך משתמשים בהודעת השגיאה
אם יש לכם גישה להודעת השגיאה המלאה שהתקבלה מ-Apigee Edge, תוכלו לעיין ב
faultstring. הכותרתfaultstringמכילה את שם הכותרת שנשלח יותר מפעם אחת.הודעת שגיאה לדוגמה:
"faultstring":"Duplicate Header \"Expires\""
- בהודעת השגיאה שלמעלה, אפשר לראות שהכותרת
Expiresנשלחת יותר מפעם אחת, כפי שמוצג ב-faultstring.
הבקשה בפועל
שימוש בבקשה בפועל
אם יש לכם גישה לבקשה בפועל שנשלחה על ידי אפליקציית הלקוח, צריך לבצע את השלבים הבאים:
- בודקים את רשימת הכותרות שמועברות בבקשה.
- אם אתם מגלים שכותרת מסוימת מופיעה יותר מפעם אחת בבקשה עם אותו ערך או עם ערכים שונים , זהו הגורם לשגיאה הזו.
בקשה לדוגמה:
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.- לחלופין, אם יש לכם גישה ליומני הלקוח, תוכלו לבדוק אם יש בהם מידע על הבקשה בפועל שנשלחה אל Apigee Edge ולקבוע את הכותרת שנשלחה יותר מפעם אחת.
רזולוציה
פתרון בעיות שקשורות לשכפול
אפשרות 1 [האפשרות המומלצת] תיקון אפליקציית הלקוח כדי שלא תכלול כותרות כפולות
- מנתחים את הסיבה לכך שהלקוח הספציפי שולח כותרת כפולה. לדוגמה,
Expiresבמקרה שלמעלה. מוודאים שאין בעיה ששרתי ה-API proxy יקבלו את הכותרת הכפולה. בדרך כלל, לא מומלץ להשתמש בשיטה הזו לפי מפרט HTTP RFC7230. - אם זה לא רצוי, צריך לשנות את אפליקציית הלקוח כך שלא יישלחו כותרות כפולות.
בדוגמה שצוינה למעלה, אפשר לראות שהכותרת
Expiresנשלחת פעמיים עם אותו ערך, וזה לא רצוי. כדי לפתור את הבעיה, צריך להעביר את הכותרתExpiresרק פעם אחת, כמו שמוצג בהמשך:curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
- אם רוצים לאפשר את הכותרות הכפולות, אפשר לעבור אל אפשרות 2: שימוש בנכס CwC.
CwC
אפשרות 2: שימוש בנכס CwC
Apigee מספק מאפיין
CwC HTTPHeader.<HeaderName> ,שמאפשר לאפליקציות לקוח ולשרתי יעד לשלוח כותרות כפולות ל-API proxies ב-Apigee Edge.
| נכס CwC | ערכים |
|---|---|
HTTPHeader.<HeaderName> |
allowDuplicates,multivalued |
לדוגמה, אפשר להגדיר את המאפיין הבא במעבדי ההודעות כדי לאפשר כפילויות וכמה ערכים בכותרת Expires.
HTTPHeader.Expires=allowDuplicates, multiValued
- אם אתם משתמשים ב-Private Cloud, אתם יכולים להגדיר את המאפיין כדי למנוע מ-Apigee Edge להציג שגיאת
400 Bad Request, גם אם הבקשה מכילה כותרות כפולות. לשם כך, תוכלו להיעזר במדריך הגדרת מעבדי הודעות לשימוש בכותרות כפולות. - אם אתם משתמשים ב-Public Cloud, אתם יכולים לפנות אל התמיכה של Apigee Edge כדי להגדיר את המאפיין הזה לארגון שלכם.
מפרט
מערכת Apigee מצפה שאפליקציית הלקוח לא תשלח כותרות כפולות כחלק מהבקשה, בהתאם למפרטים הבאים של RFC:
| מפרט |
|---|
| RFC 7230, section 3.2.2: Field Order |
| RFC 7230, section 3.2 Header Fields |
אם עדיין דרושה לך עזרה מצוות התמיכה של Apigee, אפשר לעבור אל איסוף מידע לצורך אבחון.
צריך לאסוף פרטי אבחון
אוספים את נתוני האבחון הבאים ופונים אל התמיכה של Apigee Edge.
אם אתם משתמשי ענן ציבורי, עליכם לספק את הפרטים הבאים:
- שם הארגון
- שם הסביבה
- שם ה-proxy ל-API
- הפקודה
curlשבה השתמשת כדי לשחזר את השגיאה400 - קובץ מעקב לבקשות ה-API
אם אתם משתמשים ב-Private Cloud, עליכם לספק את הפרטים הבאים:
- הודעת השגיאה המלאה שזוהתה בבקשות שנכשלו
- שם הסביבה
- חבילת 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