מוצג המסמך של Apigee Edge.
עוברים אל
מסמכי תיעוד של Apigee X. מידע
תיאור הבעיה
אפליקציית הלקוח מקבלת קוד סטטוס HTTP של 500 Internal Server Error עם
את קוד השגיאה protocol.http.BadPath כתגובה לקריאות ל-API.
הודעת שגיאה
אפליקציית הלקוח מקבלת את קוד התגובה הבא:
HTTP/1.1 500 Internal Server Error
בנוסף, יכול להיות שתופיע הודעת השגיאה הבאה:
{
"fault":{
"faultstring":"Invalid request path",
"detail":{
"errorcode":"protocol.http.BadPath"
}
}
}גורמים אפשריים
השגיאה הזו מתקבלת אם כתובת ה-URL של הבקשה של שרת הקצה העורפי מיוצגת על ידי משתנה הזרימה
target.url,
מכיל path שמתחיל בסימן שאלה (?)
של קו נטוי קדימה (/), שהוא לא חוקי.
בהתאם למפרט RFC 3986, סעיף 3: רכיבי תחביר וגם RFC 3986, סעיף 3.3: נתיב:
תחביר ה-URI כולל את הרכיבים הבאים:
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment- הרכיב
pathהוא חובה והוא חייב להתחיל ב- תמיד יהיה קו נטוי קדימה (/).
לכן, אם בכתובת ה-URL של הבקשה של שרת הקצה העורפי יש רכיב path שמתחיל
עם סימן שאלה (?) במקום קו נטוי קדימה (/), ואז Apigee
התגובה של Edge היא 500 Internal Server Error וקוד השגיאה
protocol.http.BadPath
לדוגמה: אם target.url מכיל את הערך
https://www.mocktarget.apigee.net?json, השגיאה הזו מתרחשת
נמצא שהפונקציה path לא חוקית כי היא מתחילה בסימן שאלה
(?) במקום קו נטוי קדימה (/).
| סיבה | תיאור | הוראות לפתרון בעיות עבור |
|---|---|---|
| הנתיב בכתובת ה-URL של שרת הקצה העורפי (target.url) לא תקין | רכיב הנתיב בכתובת ה-URL של שרת הקצה העורפי שמיוצג על ידי משתנה הזרימה
target.url מתחיל בסימן שאלה (?) במקום קדימה
קו נטוי (/). |
משתמשי Edge בענן הציבורי והפרטי |
שלבי אבחון נפוצים
יש להשתמש באחד מהכלים או השיטות הבאים כדי לאבחן את השגיאה:
מעקב API
הליך מס' 1: שימוש במעקב API
כדי לאבחן את השגיאה באמצעות API Monitoring:
- נכנסים ל-Apigee Edge UI כמשתמש עם התפקיד המתאים.
עוברים לארגון שבו רוצים לחקור את הבעיה.
- מנווטים אל ניתוח > מעקב API > לחקור את הדף.
- בוחרים את מסגרת הזמן הספציפית שבה הבחנתם בשגיאות.
הציגו את קוד התקלה ביחס ל-Time.
צריך לבחור תא עם קוד השגיאה
protocol.http.BadPath, כמו שמוצג למטה:
מידע על קוד התקלה
protocol.http.BadPathמוצג כך מוצגת למטה:
לוחצים על צפייה ביומנים ומרחיבים את השורה של הבקשה שנכשלה.
- בחלון יומנים שימו לב לפרטים הבאים:
- קוד סטטוס:
500 - מקור התקלה:
target - קוד התקלה:
protocol.http.BadPath
- קוד סטטוס:
- אם מקור התקלה הוא
targetו-קוד השגיאה הואprotocol.http.BadPath, אז מציין שכתובת ה-URL של שרת הקצה העורפי כוללת נתיב לא חוקי.
Trace
הליך מס' 2: שימוש בכלי המעקב
כדי לאבחן את השגיאה באמצעות כלי המעקב:
- להפעיל את סשן המעקב ואז
- צריך להמתין עד שהשגיאה
500 Internal Server Errorתתרחש, או - אם הצלחתם לשחזר את הבעיה, יש לבצע את הקריאה ל-API כדי לשחזר את הבעיה
500 Internal Server Error
- צריך להמתין עד שהשגיאה
מוודאים שהאפשרות Show all FlowInfos מופעלת:

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

שימו לב לערך השגיאה שמופיע במעקב:
שגיאה: נתיב בקשה לא תקין
מכיוון שהשגיאה הועלתה על ידי Apigee Edge אחרי שהתחילו תהליך של בקשת יעד שלב זה מציין שיש נתיב לא חוקי בכתובת ה-URL של שרת הקצה העורפי. במקרה כזה הוא עשוי להתרחש אם משתנה הזרימה
target.url(המייצג את כתובת ה-URL) עבור שרת קצה עורפי) ב-Apigee Edge אולי עודכן עם נתיב לא חוקי אחד מכללי המדיניות בתהליך בקשת היעד.- לבחון את הקטע משתנים שנקראים והוקצו בכל אחד מהזרימה אחורה מתהליך השגיאה ועד לשלב התהליך של יעד הבקשה התחיל.
- קובעים את המדיניות שבה היה משתנה הזרימה
target.urlעודכן:מעקב לדוגמה שמראה את מדיניות JavaScript עדכנה את משתנה הזרימה
target.url:
במעקב לדוגמה שלמעלה, שימו לב לערך של משתנה הזרימה
target.urlעודכן במדיניות JavaScript בשםJS- SetTargetURLבאופן הבא:target.url : https://mocktarget.apigee.net?json - שימו לב שהערך ב-
target.urlכולל את הרכיבים הבאים:- סכימה:
https - רשות:
mocktarget.apigee.net - נתיב:
?json
- סכימה:
- מאחר שרכיב הנתיב מתחיל בסימן שאלה (
?) במקום קו נטוי קדימה (/), מקבלים את השגיאהInvalid request path - מנווטים לשלב AX (נתוני Analytics מתועדים) במעקב ולוחצים עליו.
גוללים למטה אל הקטע פרטי שלב - כותרות של שגיאות ומזהים את של X-Apigee-fault-code ו-X-Apigee-fault-source כפי שמוצג כאן:

יופיעו הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source בתור
protocol.http.BadPathו-targetבהתאמה, שמציין שהשגיאה הזאת נגרמת מפני שכתובת ה-URL של שרת הקצה העורפי מכילה נתיב לא חוקי.כותרות של תשובות ערך X-Apigee-fault-code protocol.http.BadPathX-Apigee-fault-source target
NGINX
הליך מס' 3: שימוש ביומני גישה ל-NGINX
כדי לאבחן את השגיאה באמצעות יומני הגישה של NGINX:
- אם אתם משתמשים של ענן פרטי, אתם יכולים להשתמש ביומני הגישה ל-NGINX כדי להבין
את המידע העיקרי על HTTP
500 Internal Server Error. בודקים את יומני הגישה ל-NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log- מחפשים אם יש שגיאות
500עם קוד שגיאהprotocol.http.BadPathבמהלך פרק זמן ספציפי (אם הבעיה התרחשה בעבר) או אם יש בקשות שעדיין נכשלות עם500. אם מופיעות שגיאות
500עם התאמה של X-Apigee-fault-code את הערך שלprotocol.http.BadPath, ואז קובעים את הערך של פונקציית ה-X- Apigee-fault-source.דוגמה לשגיאה 500 ביומן הגישה ל-NGINX:
הרשומה לדוגמה שלמעלה מיומן הגישה ל-NGINX כוללת את הערכים הבאים עבור X-Apigee- קוד שגיאה ו-X-Apigee-fault-source:
כותרות ערך X-Apigee-fault-code protocol.http.BadPathX-Apigee-fault-source targetשימו לב שהערכים של X-Apigee-fault-code ו-X-Apigee-fault-source הם
protocol.http.BadPathו-targetבהתאמה, מציינים שהשגיאה הזאת נגרמת כי בכתובת ה-URL של שרת הקצה העורפי יש נתיב לא חוקי.
הסיבה: נתיב כתובת ה-URL של שרת הקצה העורפי (target.url) לא תקין
אבחון
- מגדירים את Fault Code ואת מקור התקלה של
500 Internal Server Errorבאמצעות API Monitoring, כלי מעקב או יומני גישה ל-NGINX, כמו שמוסבר ב שלבי האבחון הנפוצים. - אם קוד התקלה הוא
protocol.http.BadPathו-Fault Source כולל הערךtarget, אז מציין שבכתובת ה-URL של שרת הקצה העורפי יש ערך לא חוקי . כתובת ה-URL של שרת הקצה העורפי מיוצגת על ידי משתנה הזרימה
target.urlב-Apigee קצה. השגיאה הזו בדרך כלל מתרחשת כשמנסים לעדכן את כתובת ה-URL של שרת הקצה העורפי (target.url) באופן דינמי באמצעות כל אחד מכללי המדיניות (בתוך Proxy/תהליך משותף) בתהליך הבקשה של היעד, כך שיש נתיב לא חוקי.בודקים אם משתנה הזרימה
target.urlאכן לא חוקי path והמקור של הערך שלו באחת מהשיטות הבאות:Trace
שימוש בכלי המעקב
אם תיעדתם מעקב אחרי השגיאה הזו, אתם יכולים לפעול לפי השלבים שמתוארים ב שימוש בכלי המעקב וגם
- צריך לבדוק אם הנתיב של
target.urlלא תקין, כלומר אם הוא מתחיל עם סימן שאלה (?) במקום קו נטוי קדימה (/). אם כן, מחפשים את המדיניות ששינתה או עדכנה את הערך של
target.urlכדי להכיל נתיב לא חוקי.מעקב לדוגמה שמראה את מדיניות JavaScript עדכנה את משתנה הזרימה
target.url
- במעקב לדוגמה שלמעלה, שימו לב שמדיניות JavaScript שינתה או עדכנה את הערך של
target.urlכך שהוא מכיל נתיב לא חוקי. - לתשומת ליבכם:
target.urlכולל את הרכיבים הבאים:- סכימה:
https - רשות:
mocktarget.apigee.net - נתיב:
?json
הנתיב מתחיל בסימן שאלה (
?) במקום בסימן קדימה קו נטוי (/), כך שהוא לא תקין. - סכימה:
יומנים
שימוש ביומנים בשרת היומנים
- אם אין לכם מעקב אחר השגיאה הזו (בעיה זמנית), כדאי לבדוק אם
תיעדתם את המידע על הערך של משתנה הזרימה
target.url, באמצעות כללי מדיניות כמו MessageLogging או ServiceCallout לשרת היומנים. - אם יש לכם את היומנים, בדקו אותם
- צריך לבדוק אם ב-
target.urlיש נתיב לא תקין, וגם - בדיקה אם יש לך אפשרות לקבוע את המידע לגבי השינוי במדיניות
target.urlלהכיל נתיב לא חוקי
- צריך לבדוק אם ב-
API מסוג proxy
בדיקה של שרת ה-proxy ל-API שנכשלו
אם אין לכם מעקב או יומנים לגבי השגיאה הזו, אתם יכולים לבדוק את ה-API שנכשל שרת proxy כדי לקבוע מה שינה או עדכן את משתנה הזרימה
target.urlכדי להכיל נתיב לא חוקי. בדוק את הפרטים הבאים:- המדיניות בתוך שרת proxy ל-API
- כל תהליכי העבודה המשותפים שהופעלו על ידי שרת ה-proxy
- צריך לבדוק אם הנתיב של
חשוב לבדוק בקפידה את המדיניות הספציפית (לדוגמה: AssignMessage או JavaScript) שמשנה או מעדכנים את משתנה הזרימה
target.urlוקובעים את הסיבה מעדכנים אתtarget.urlכך שיש נתיב לא תקין.לפניכם מספר כללי מדיניות לדוגמה לעדכון משתנה הזרימה
target.urlכך שהוא מכיל נתיב לא חוקי שמוביל לשגיאה הזאת.דוגמא מס' 1
דוגמה ראשונה: עדכון של משתנה
target.urlבמדיניות JavaScriptvar url = "https://mocktarget.apigee.net?json" context.setVariable("target.url", url);
בדוגמה שלמעלה, חשוב לשים לב שמשתנה הזרימה
target.urlמעודכן עם הערךhttps://mocktarget.apigee.net?jsonשכלול בעמודה אחרת משתנהurl.חשוב לשים לב שהערך של
urlכולל את הרכיבים הבאים:- סכימה:
https - רשות:
mocktarget.apigee.net - נתיב:
?json
הנתיב מתחיל בסימן שאלה (
?) במקום בקו נטוי (/), שהוא לא תקין. לכן, Apigee Edge מחזירה500 Internal Server Errorעם קוד השגיאהprotocol.http.BadPath.דוגמא מס' 2
דוגמה שנייה: עדכון של משתנה
target.urlבמדיניות JavaScript על סמך הערך בכותרת הבקשהvar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
בדוגמה שלמעלה, ניתן לראות שמשתנה הזרימה
target.urlמעודכן באמצעות שרשור הערךhttps://mocktarget.apigee.netשכלולurlו הערך של משתנהpathאחר, שהערך שלו אוחזר מ-request.header.Path.אם יש לך גישה לבקשה או למעקב בפועל, אפשר לאמת את הערך בפועל הועברה אל
request.header.Path.בקשה לדוגמה של המשתמש
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: ?user"
בדוגמה הזו, נתיב הכותרת לא נשלח כחלק מהבקשה. לכן, הערך של המשתנה
pathבמדיניות JavaScript הואnull.כך:
url = https://mocktarget.apigee.net + pathurl = https://mocktarget.apigee.net + "?user"target.url = https://mocktarget.apigee.net?user
חשוב לשים לב שהערך של
target.urlכולל את הרכיבים הבאים:- סכימה:
https - רשות:
mocktarget.apigee.net - נתיב:
?user
הנתיב מתחיל בסימן שאלה (
?) במקום בקו נטוי (/), שהוא לא תקין. לכן, Apigee Edge מחזירה את הערך500 Internal Server Errorעם קוד השגיאהprotocol.http.BadPath.דוגמא מס' 3
דוגמה 3: עדכון המדיניות של assignMessage
target.url<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net?echo</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
חשוב לשים לב שהערך של
urlכולל את הרכיבים הבאים:- סכימה:
https - רשות:
mocktarget.apigee.net - נתיב:
?echo
שוב בדוגמה הזו, הנתיב מתחיל בסימן שאלה (
?) במקום קו נטוי קדימה (/), שהוא לא תקין. לכן, Apigee Edge מחזירה את הערך500 Internal Server Errorעם קוד שגיאהprotocol.http.BadPath.- סכימה:
רזולוציה
בהתאם למפרט של כתובת ה-URL
RFC 3986, סעיף 3: רכיבי תחביר, רכיב path הוא חובה
והוא חייב להתחיל תמיד ב-"/". לכן, מבצעים את השלבים הבאים כדי לפתור את הבעיה:
- עליך לוודא שכתובת האתר של שרת הקצה העורפי, שמיוצגת על ידי משתנה הזרימה
לפונקציה
target.urlיש תמיד נתיב תקין והוא מתחיל תמיד ב- קו נטוי קדימה (/).- במקרים מסוימים, ייתכן שאין שם משאב בנתיב, ולאחר מכן ודאו
הנתיב לפחות מכיל קו נטוי קדימה (
/). - אם משתמשים במשתנים אחרים כדי לקבוע את הערך של משתנה הזרימה,
target.url, ולאחר מכן מוודאים שאין במשתנים אחרים נתיב לא חוקי. - אם מבצעים פעולות מחרוזת כלשהן כדי לקבוע את הערך של משתנה הזרימה
target.url, ואז מוודאים שהתוצאה או התוצאה של המחרוזת בפעולות אין נתיב לא תקין.
- במקרים מסוימים, ייתכן שאין שם משאב בנתיב, ולאחר מכן ודאו
הנתיב לפחות מכיל קו נטוי קדימה (
בדוגמאות שהוזכרו למעלה, אפשר לתקן את הבעיה כמו שמוסבר בהמשך:
דוגמא מס' 1
דוגמה ראשונה: עדכון של משתנה
target.urlבמדיניות JavaScriptצריך להשתמש בקו נטוי (
/) במקום בסימן שאלה (?) משתנהurlכדי לפתור את הבעיה כפי שמוצג כאן:var url = "https://mocktarget.apigee.net/json" context.setVariable("target.url", url);
דוגמא מס' 2
דוגמה שנייה: עדכון של משתנה
target.urlבמדיניות JavaScript על סמך הערך בכותרת הבקשהvar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
חשוב להעביר נתיב תקין, לדוגמה:
/userכחלק מהבקשה כותרתPathכדי לתקן את הבעיה הזו כפי שמוצג בהמשך:בקשה לדוגמה:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /user"
דוגמא מס' 3
דוגמה מס' 3: עדכון המדיניות של assignMessage
target.urlצריך להוסיף נתיב חוקי לרכיב
<Value>של מדיניות AssignMessage. כלומר, צריך להחליף את סימן השאלה (?) במחרוזת a קו נטוי קדימה (/) ברכיב<Value>ו כדי לפתור את הבעיה, צריך להגדיר אותו ל-https://mocktarget.apigee.net/echoכפי שמוצג בהמשך:<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net/echo</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
מפרט
Apigee Edge מצפה שה
pathרכיב בכתובת ה-URL של שרת הקצה העורפי חובה להתחיל תמיד ב קו נטוי (/) בהתאם למקרה מפרטים:מפרט RFC 3986, סעיף 3: רכיבי תחביר RFC 3986, סעיף 3.3: נתיב אם דרושה עזרה נוספת מהתמיכה של Apigee, אפשר לעבור למאמר נדרש איסוף פרטי אבחון.
חובה לאסוף פרטי אבחון
אם הבעיה נמשכת גם לאחר ביצוע ההוראות שלמעלה, יש לאסוף את הפריטים הבאים את פרטי האבחון ולאחר מכן פונים לתמיכה של Apigee Edge:
אם אתם משתמשים ב-Public Cloud, עליכם לספק את הפרטים הבאים:
- שם הארגון
- שם הסביבה
- שם ה-Proxy ל-API
- צריך להשלים את הפקודה
curlשמשמשת לשחזור500 Internal Server Errorעם קוד השגיאהprotocol.http.BadPath - קובץ מעקב אחר בקשות ה-API
אם אתם משתמשים בענן פרטי, עליכם לספק את הפרטים הבאים:
- הודעת שגיאה מלאה שנצפתה בבקשות שנכשלו
- שם הסביבה
- חבילת proxy ל-API
- קובץ מעקב אחר בקשות ה-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
קובצי עזר