מוצג המסמך של 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 UI כמשתמש עם תפקיד מתאים.
עוברים לארגון שבו רוצים לחקור את הבעיה.
- מנווטים אל ניתוח > מעקב API > לחקור את הדף.
- בוחרים את מסגרת הזמן הספציפית שבה הבחנתם בשגיאות.
- מוודאים שמסנן שרת ה-proxy מוגדר ל-All.
- הציגו את קוד התקלה ביחס ל-Time.
צריך לבחור תא עם קוד השגיאה
protocol.http.DuplicateHeader
כפי שמוצג בהמשך:מידע על קוד התקלה
protocol.http.DuplicateHeader
הוא מוצגת כפי שמוצג כאן:- לוחצים על הצגת היומנים ומרחיבים את השורה של הבקשה שנכשלה.
- בחלון יומנים שימו לב לפרטים הבאים:
- קוד סטטוס:
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 כוללת את הערכים הבאים עבור X-Apigee- קוד שגיאה ו-X-Apigee-fault-source:
כותרות של תשובות ערך X-Apigee-fault-code protocol.http.DuplicateHeader
X-Apigee-fault-source MP
הסיבה: הבקשה מכילה כותרת כפולה
אבחון
- מגדירים את קוד השגיאה ואת מקור התקלה של השגיאה שזוהתה באמצעות ה-API יומני מעקב או יומני גישה ל-NGINX, כמו שמוסבר בשלבי האבחון הנפוצים.
- אם מקור התקלה מכיל את הערך
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>
,שמאפשר ללקוח
לאפליקציות ולשרתי יעד לשלוח כותרות כפולות לשרתי proxy ל-API ב-Apigee Edge.
נכס CwC | ערכים |
---|---|
HTTPHeader.<HeaderName> |
allowDuplicates,multivalued |
לדוגמה, אפשר להגדיר את המאפיין הבא במעבדי ההודעות כדי לאפשר כפילויות
ביותר ערכים עבור הכותרת Expires
.
HTTPHeader.Expires=allowDuplicates, multiValued
- אם אתם משתמשים בענן פרטי, תוכלו להגדיר את הנכס כדי למנוע
Apigee Edge מהעלאת שגיאת
400 Bad Request
, גם אם הבקשה מכיל כותרות כפולות שמשתמשות ברכיב מגדירים את מעבדי ההודעות לשימוש בכותרות כפולות. - אם אתם משתמשים בענן ציבורי, עליכם לפנות לתמיכה של 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