כרגע מוצג התיעוד של 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:
- נכנסים לממשק המשתמש של Apigee Edge בתור משתמשים עם תפקיד מתאים.
עוברים לארגון שבו רוצים לבדוק את הבעיה.
- עוברים לדף ניתוח > API Monitoring > חקירה.
- בוחרים את מסגרת הזמן הספציפית שבה הבחנתם בשגיאות.
- מוודאים שהמסנן 'שרת proxy' מוגדר להכול.
- יש להציב את קוד השגיאה ביחס ל-Time.
בוחרים תא שמכיל את קוד השגיאה
protocol.http.DuplicateHeader
כפי שמוצג בהמשך:מידע על קוד התקלה
protocol.http.DuplicateHeader
מוצג באופן שמוצג למטה:- לוחצים על View Logs (הצגת היומנים) ומרחיבים את השורה של הבקשה שנכשלה.
- בחלון Logs, שימו לב לפרטים הבאים:
- קוד סטטוס:
400
- מקור התקלה:
apigee
- קוד תקלה:
protocol.http.DuplicateHeader
.
- קוד סטטוס:
- אם ל-Fault Source יש את הערך
apigee
אוMP
, ול-Fault Code יש את הערךprotocol.http.DuplicateHeader
, המשמעות היא שבקשת ה-HTTP מהלקוח מכילה כותרות כפולות.
כלי המעקב
NGINX
כדי לאבחן את השגיאה באמצעות יומני הגישה של NGINX:
- אם אתם משתמשים בענן פרטי, תוכלו להשתמש ביומני הגישה של 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 Access כוללת את הערכים הבאים עבור X-Apigee- fault-code ו-X-Apigee-fault-source:
כותרות תגובה Value X-Apigee-fault-code protocol.http.DuplicateHeader
X-Apigee-fault-source MP
הסיבה: כותרת כפולה בבקשה
אבחון
- מאתרים את קוד התקלה ואת מקור התקלה של השגיאה שזוהתה באמצעות יומני API Monitoring או יומני הגישה של 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
במקרה שלמעלה. ודאו ששרתי ה-proxy של ה-API יכולים לקבל את הכותרת הכפולה. בדרך כלל, הקובץ לא רצוי בהתאם למפרט ה-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 של API ב-Apigee Edge.
נכס CwC | ערכים |
---|---|
HTTPHeader.<HeaderName> |
allowDuplicates,multivalued |
לדוגמה, אפשר להגדיר את המאפיין הבא במעבדי ההודעות כדי לאפשר כפילויות וערכים מרובים עבור הכותרת Expires
.
HTTPHeader.Expires=allowDuplicates, multiValued
- אם אתם משתמשים בענן פרטי, אתם יכולים להגדיר את המאפיין כדי למנוע מ-Apigee Edge להעלות את השגיאה
400 Bad Request
, גם אם הבקשה מכילה כותרות כפולות באמצעות המדריך הגדרה של מעבדי הודעות לשימוש בכותרות כפולות. - אם אתם משתמשים ב-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