מוצג המסמך של 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.BadPath
X-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.BadPath
X-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 + path
url = 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
קובצי עזר