כרגע מוצג התיעוד של 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 Monitoring
כדי לאבחן את השגיאה באמצעות API Monitoring:
- נכנסים לממשק המשתמש של Apigee Edge בתור משתמשים עם תפקיד מתאים.
עוברים לארגון שבו רוצים לבדוק את הבעיה.
- עוברים לדף ניתוח > API Monitoring > חקירה.
- בוחרים את מסגרת הזמן הספציפית שבה הבחנתם בשגיאות.
יש להציב את קוד השגיאה ביחס ל-Time.
צריך לבחור תא שמכיל את קוד השגיאה
protocol.http.BadPath
כפי שמוצג למטה:מידע על קוד התקלה
protocol.http.BadPath
מוצג באופן הבא:לוחצים על View Logs (הצגת היומנים) ומרחיבים את השורה של הבקשה שנכשלה.
- בחלון Logs, שימו לב לפרטים הבאים:
- קוד סטטוס:
500
- מקור התקלה:
target
- קוד שגיאה:
protocol.http.BadPath
- קוד סטטוס:
- אם מקור ה-Fault הוא
target
וקוד התקלה הואprotocol.http.BadPath
, פירוש הדבר הוא שכתובת ה-URL של שרת הקצה העורפי היא נתיב לא חוקי.
נתוני מעקב
הליך מס' 2: שימוש בכלי המעקב
כדי לאבחן את השגיאה באמצעות כלי המעקב:
- מפעילים את סשן המעקב ואז
- להמתין עד שהשגיאה
500 Internal Server Error
תתרחש, או - אם הצלחת לשחזר את הבעיה, יש לבצע את הקריאה ל-API כדי לשחזר את הבעיה
500 Internal Server Error
- להמתין עד שהשגיאה
יש לוודא שהאפשרות Show allflowInfos מופעלת:
- בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
- אפשר לנווט בשלבים השונים של המעקב ולאתר את המיקום שבו אירעה הכשל.
השגיאה מופיעה בדרך כלל בזרימה אחרי השלב התהליך של בקשת היעד שהתחיל כפי שמוצג כאן:
יש לשים לב לערך השגיאה מתוך המעקב:
שגיאה: נתיב הבקשה לא תקין
מכיוון ש-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
- path:
?json
- סכמה:
- מאחר שהרכיב path מתחיל בסימן שאלה (
?
) במקום בקו נטוי (/
), מתקבלת הודעת השגיאהInvalid request path
. - מנווטים לשלב AX (רישום נתונים ב-Analytics) במעקב ולוחצים עליו.
גוללים למטה לקטע Phase Details – Error Headers ומוצאים את הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source.
הערכים של X-Apigee-fault-code ושל X-Apigee-fault-source יופיעו כ-
protocol.http.BadPath
וגםtarget
בהתאמה, כדי לציין שהשגיאה הזו נגרמת כי כתובת ה-URL של שרת הקצה העורפי מכילה נתיב לא חוקי.כותרות תגובה Value 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 תואם לערך של X-Apigee-fault-code , צריך לקבוע את הערך של X- Apigee-fault-source.שגיאה 500 לדוגמה ביומן הגישה של NGINX:
הרשומה לדוגמה שלמעלה מיומן הגישה של NGINX כוללת את הערכים הבאים עבור X-Apigee- fault-code ו-X-Apigee-fault-source:
כותרות Value 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) לא תקין
אבחון
- קובעים את קוד התקלה ואת מקור התקלה של
500 Internal Server Error
באמצעות API Monitoring, כלי המעקב או יומני גישה של NGINX, כמו שמוסבר בשלבים הנפוצים לאבחון. - אם Fault Code (קוד תקלה) הוא
protocol.http.BadPath
ו-FaultSource יש את הערךtarget
, זה אומר שבכתובת ה-URL של שרת הקצה העורפי יש נתיב לא חוקי. כתובת ה-URL של שרת הקצה העורפי מיוצגת על ידי משתנה הזרימה
target.url
ב-Apigee Edge. שגיאה זו מתרחשת בדרך כלל כשמנסים לעדכן את כתובת ה-URL של השרת העורפי (target.url
) דינמית באמצעות אחד מכללי המדיניות (בתהליך של שרת proxy או של שיתוף משותף) בתהליך הבקשה ליעד, במקרה שיש בה נתיב לא חוקי.כדי לבדוק אם משתנה הזרימה
target.url
אכן מכיל path לא חוקי ואת המקור של הערך שלו, משתמשים באחת מהשיטות הבאות:נתוני מעקב
שימוש בכלי המעקב
אם תיעדתם מעקב אחרי השגיאה הזו, צריך לבצע את השלבים שמתוארים במאמר שימוש בכלי המעקב ואז
- צריך לבדוק אם יש נתיב לא תקין בשדה
target.url
, כלומר אם הוא מתחיל בסימן שאלה (?
) ולא בקו נטוי (/
). אם כן, צריך לבדוק את המדיניות ששינתה או עדכנה את הערך של
target.url
כך שהנתיב לא תקין.מעקב לדוגמה שמציג מדיניות JavaScript עדכן את משתנה הזרימה
target.url
- במעקב לדוגמה שלמעלה, יש לשים לב שמדיניות JavaScript שינתה או עדכנה את הערך של
target.url
כך שהיא תכיל נתיב לא חוקי. - שימו לב שהגרסה
target.url
כוללת את הרכיבים הבאים:- סכמה:
https
- רשות:
mocktarget.apigee.net
- path:
?json
הנתיב מתחיל בסימן שאלה (
?
) במקום בקו נטוי (/
), לכן הוא לא חוקי. - סכמה:
יומנים
שימוש ביומנים בשרת היומנים
- אם אין לכם נתוני מעקב לשגיאה הזו (בעיה זמנית), צריך לבדוק אם תיעדתם את המידע לגבי הערך של משתנה הזרימה
target.url
באמצעות כללי מדיניות כמו MessageLogging או מדיניות ServiceCalloutבשרת היומן שלכם. - אם היומנים נמצאים ברשותכם, בודקים אותם
- צריך לוודא שהנתיב ב-
target.url
לא תקין. - אפשר לבדוק אם אפשר לקבוע את המידע לגבי המדיניות ששונתה
target.url
כך שהכילה נתיב לא חוקי
- צריך לוודא שהנתיב ב-
API מסוג proxy
בדיקת שרת ה-API שנכשל
אם אין לכם מעקב או יומנים לשגיאה הזו, בדקו את שרת ה-proxy הנכשל של ה-API כדי להבין מה שינה או עדכן את משתנה הזרימה
target.url
כך שמכיל נתיב לא חוקי. מומלץ לבדוק ולבצע את הדברים הבאים:- המדיניות בתוך שרת proxy ל-API
- תהליכי עבודה משותפים שהופעלו דרך שרת ה-proxy
- צריך לבדוק אם יש נתיב לא תקין בשדה
יש לבחון בקפידה את המדיניות הספציפית (לדוגמה: assignMessage או JavaScript) שמשנה או מעדכנת את משתנה הזרימה
target.url
, ולקבוע מה הסיבה לעדכון הנתיב לא חוקי שלtarget.url
.הנה כמה כללי מדיניות לדוגמה שמעדכנים את משתנה הזרימה
target.url
בצורה שגויה כדי לכלול נתיב לא חוקי שמוביל לשגיאה הזו.דוגמה מס' 1
דוגמה ראשונה: מדיניות JavaScript שמעדכנת את המשתנה
target.url
var url = "https://mocktarget.apigee.net?json" context.setVariable("target.url", url);
בדוגמה שלמעלה, שימו לב שמשתנה הזרימה
target.url
מתעדכן בערךhttps://mocktarget.apigee.net?json
שכלול במשתנה אחרurl.
חשוב לשים לב שהערך של
url
כולל את הרכיבים הבאים:- סכמה:
https
- רשות:
mocktarget.apigee.net
- path:
?json
הנתיב מתחיל בסימן שאלה (
?
) במקום בקו נטוי (/
), שהוא לא חוקי. לכן, Apigee Edge מחזירה את הערך500 Internal Server Error
עם קוד השגיאהprotocol.http.BadPath
.דוגמה מס' 2
דוגמה 2: מדיניות JavaScript שמעדכנת את המשתנה
target.url
על סמך הערך בכותרת הבקשה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
- path:
?user
הנתיב מתחיל בסימן שאלה (
?
) במקום בקו נטוי (/
), שהוא לא חוקי. לכן, Apigee Edge מחזירה את הערך500 Internal Server Error
עם קוד השגיאהprotocol.http.BadPath
.דוגמה מס' 3
דוגמה מס' 3: מדיניות הקצאה של עדכון משתנה
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
- path:
?echo
שוב בדוגמה הזו, הנתיב מתחיל בסימן שאלה (
?
) במקום בקו נטוי (/
), שהוא לא חוקי. לכן, Apigee Edge מחזירה את הערך500 Internal Server Error
עם קוד השגיאהprotocol.http.BadPath
.- סכמה:
רזולוציה
בהתאם למפרט של כתובת ה-URL
RFC 3986, סעיף 3: רכיבי תחביר, נדרש רכיב path
והוא חייב להתחיל תמיד ב-"/" . כדי לפתור את הבעיה, עליכם לפעול לפי השלבים הבאים:
- חשוב לוודא שכתובת ה-URL של שרת הקצה העורפי, המיוצגת על ידי משתנה הזרימה
target.url
, כוללת תמיד נתיב תקין והיא תמיד מתחילה בקו נטוי (/
).- במקרים מסוימים יכול להיות שלא יהיה שם של משאב בנתיב, צריך לוודא
שהנתיב מכיל לפחות קו נטוי לפנים (
/
). - אם אתם משתמשים במשתנים אחרים כדי לקבוע את הערך של משתנה הזרימה
target.url
, חשוב לוודא שלמשתנים אחרים אין נתיב לא חוקי. - אם מבצעים פעולות במחרוזת כדי לקבוע את הערך של משתנה הזרימה
target.url
, חשוב לוודא שלתוצאה או לתוצאה של פעולות המחרוזת אין נתיב לא חוקי.
- במקרים מסוימים יכול להיות שלא יהיה שם של משאב בנתיב, צריך לוודא
שהנתיב מכיל לפחות קו נטוי לפנים (
בדוגמאות שלמעלה, תוכלו לתקן את הבעיה הזו כפי שמוסבר בהמשך:
דוגמה מס' 1
דוגמה ראשונה: מדיניות JavaScript שמעדכנת את המשתנה
target.url
כדי לתקן את הבעיה, צריך להשתמש בקו נטוי (
/
) במקום בסימן שאלה (?
) במשתנהurl
:var url = "https://mocktarget.apigee.net/json" context.setVariable("target.url", url);
דוגמה מס' 2
דוגמה 2: מדיניות JavaScript שמעדכנת את המשתנה
target.url
על סמך הערך בכותרת הבקשה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: מדיניות הקצאה של עדכון משתנה
target.url
צריך להוסיף נתיב חוקי לרכיב
<Value>
במדיניות assignMessage. כלומר, צריך להחליף את סימן השאלה (?
) ב קו נטוי לפנים (/
) ברכיב<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
קובצי עזר