500 שגיאת שרת פנימית - BadPath

מוצג המסמך של 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: נתיב:

  1. תחביר ה-URI כולל את הרכיבים הבאים:

            foo://example.com:8042/over/there?name=ferret#nose
            \_/   \______________/\_________/ \_________/ \__/
             |            |            |            |       |
          scheme      authority       path        query   fragment
    
  2. הרכיב 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:

  1. נכנסים ל-Apigee Edge UI כמשתמש עם התפקיד המתאים.
  2. עוברים לארגון שבו רוצים לחקור את הבעיה.

  3. מנווטים אל ניתוח > מעקב API > לחקור את הדף.
  4. בוחרים את מסגרת הזמן הספציפית שבה הבחנתם בשגיאות.
  5. הציגו את קוד התקלה ביחס ל-Time.

  6. צריך לבחור תא עם קוד השגיאה protocol.http.BadPath, כמו שמוצג למטה:

  7. מידע על קוד התקלה protocol.http.BadPath מוצג כך למטה:

  8. לוחצים על צפייה ביומנים ומרחיבים את השורה של הבקשה שנכשלה.

  9. בחלון יומנים שימו לב לפרטים הבאים:
    • קוד סטטוס: 500
    • מקור התקלה: target
    • קוד התקלה: protocol.http.BadPath
  10. אם מקור התקלה הוא target ו-קוד השגיאה הוא protocol.http.BadPath, אז מציין שכתובת ה-URL של שרת הקצה העורפי כוללת נתיב לא חוקי.

Trace

הליך מס' 2: שימוש בכלי המעקב

כדי לאבחן את השגיאה באמצעות כלי המעקב:

  1. להפעיל את סשן המעקב ואז
    • צריך להמתין עד שהשגיאה 500 Internal Server Error תתרחש, או
    • אם הצלחתם לשחזר את הבעיה, יש לבצע את הקריאה ל-API כדי לשחזר את הבעיה 500 Internal Server Error
  2. מוודאים שהאפשרות Show all FlowInfos מופעלת:

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

  6. שימו לב לערך השגיאה שמופיע במעקב:

    שגיאה: נתיב בקשה לא תקין

    מכיוון שהשגיאה הועלתה על ידי Apigee Edge אחרי שהתחילו תהליך של בקשת יעד שלב זה מציין שיש נתיב לא חוקי בכתובת ה-URL של שרת הקצה העורפי. במקרה כזה הוא עשוי להתרחש אם משתנה הזרימה target.url (המייצג את כתובת ה-URL) עבור שרת קצה עורפי) ב-Apigee Edge אולי עודכן עם נתיב לא חוקי אחד מכללי המדיניות בתהליך בקשת היעד.

  7. לבחון את הקטע משתנים שנקראים והוקצו בכל אחד מהזרימה אחורה מתהליך השגיאה ועד לשלב התהליך של יעד הבקשה התחיל.
  8. קובעים את המדיניות שבה היה משתנה הזרימה target.url עודכן:

    מעקב לדוגמה שמראה את מדיניות JavaScript עדכנה את משתנה הזרימה target.url:

    במעקב לדוגמה שלמעלה, שימו לב לערך של משתנה הזרימה target.url עודכן במדיניות JavaScript בשם JS- SetTargetURL באופן הבא: target.url : https://mocktarget.apigee.net?json

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

  13. יופיעו הערכים של 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:

  1. אם אתם משתמשים של ענן פרטי, אתם יכולים להשתמש ביומני הגישה ל-NGINX כדי להבין את המידע העיקרי על HTTP 500 Internal Server Error.
  2. בודקים את יומני הגישה ל-NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

  3. מחפשים אם יש שגיאות 500 עם קוד שגיאה protocol.http.BadPath במהלך פרק זמן ספציפי (אם הבעיה התרחשה בעבר) או אם יש בקשות שעדיין נכשלות עם 500.
  4. אם מופיעות שגיאות 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) לא תקין

אבחון

  1. מגדירים את Fault Code ואת מקור התקלה של 500 Internal Server Error באמצעות API Monitoring, כלי מעקב או יומני גישה ל-NGINX, כמו שמוסבר ב שלבי האבחון הנפוצים.
  2. אם קוד התקלה הוא protocol.http.BadPath ו-Fault Source כולל הערך target, אז מציין שבכתובת ה-URL של שרת הקצה העורפי יש ערך לא חוקי .
  3. כתובת ה-URL של שרת הקצה העורפי מיוצגת על ידי משתנה הזרימה target.url ב-Apigee קצה. השגיאה הזו בדרך כלל מתרחשת כשמנסים לעדכן את כתובת ה-URL של שרת הקצה העורפי (target.url) באופן דינמי באמצעות כל אחד מכללי המדיניות (בתוך Proxy/תהליך משותף) בתהליך הבקשה של היעד, כך שיש נתיב לא חוקי.

  4. בודקים אם משתנה הזרימה target.url אכן לא חוקי path והמקור של הערך שלו באחת מהשיטות הבאות:

    Trace

    שימוש בכלי המעקב

    אם תיעדתם מעקב אחרי השגיאה הזו, אתם יכולים לפעול לפי השלבים שמתוארים ב שימוש בכלי המעקב וגם

    1. צריך לבדוק אם הנתיב של target.url לא תקין, כלומר אם הוא מתחיל עם סימן שאלה (?) במקום קו נטוי קדימה (/).
    2. אם כן, מחפשים את המדיניות ששינתה או עדכנה את הערך של target.url כדי להכיל נתיב לא חוקי.

      מעקב לדוגמה שמראה את מדיניות JavaScript עדכנה את משתנה הזרימה target.url

    3. במעקב לדוגמה שלמעלה, שימו לב שמדיניות JavaScript שינתה או עדכנה את הערך של target.url כך שהוא מכיל נתיב לא חוקי.
    4. לתשומת ליבכם: target.url כולל את הרכיבים הבאים:
      • סכימה: https
      • רשות: mocktarget.apigee.net
      • נתיב: ?json

      הנתיב מתחיל בסימן שאלה (?) במקום בסימן קדימה קו נטוי (/), כך שהוא לא תקין.

    יומנים

    שימוש ביומנים בשרת היומנים

    1. אם אין לכם מעקב אחר השגיאה הזו (בעיה זמנית), כדאי לבדוק אם תיעדתם את המידע על הערך של משתנה הזרימה target.url, באמצעות כללי מדיניות כמו MessageLogging או ServiceCallout לשרת היומנים.
    2. אם יש לכם את היומנים, בדקו אותם
      1. צריך לבדוק אם ב-target.url יש נתיב לא תקין, וגם
      2. בדיקה אם יש לך אפשרות לקבוע את המידע לגבי השינוי במדיניות target.url להכיל נתיב לא חוקי

    API מסוג proxy

    בדיקה של שרת ה-proxy ל-API שנכשלו

    אם אין לכם מעקב או יומנים לגבי השגיאה הזו, אתם יכולים לבדוק את ה-API שנכשל שרת proxy כדי לקבוע מה שינה או עדכן את משתנה הזרימה target.url כדי להכיל נתיב לא חוקי. בדוק את הפרטים הבאים:

    • המדיניות בתוך שרת proxy ל-API
    • כל תהליכי העבודה המשותפים שהופעלו על ידי שרת ה-proxy
  5. חשוב לבדוק בקפידה את המדיניות הספציפית (לדוגמה: AssignMessage או JavaScript) שמשנה או מעדכנים את משתנה הזרימה target.url וקובעים את הסיבה מעדכנים את target.url כך שיש נתיב לא תקין.

    לפניכם מספר כללי מדיניות לדוגמה לעדכון משתנה הזרימה target.url כך שהוא מכיל נתיב לא חוקי שמוביל לשגיאה הזאת.

    דוגמא מס' 1

    דוגמה ראשונה: עדכון של משתנה target.url במדיניות JavaScript

    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
    • נתיב: ?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 הוא חובה והוא חייב להתחיל תמיד ב-"/". לכן, מבצעים את השלבים הבאים כדי לפתור את הבעיה:

  1. עליך לוודא שכתובת האתר של שרת הקצה העורפי, שמיוצגת על ידי משתנה הזרימה לפונקציה target.url יש תמיד נתיב תקין והוא מתחיל תמיד ב- קו נטוי קדימה (/).
    1. במקרים מסוימים, ייתכן שאין שם משאב בנתיב, ולאחר מכן ודאו הנתיב לפחות מכיל קו נטוי קדימה (/).
    2. אם משתמשים במשתנים אחרים כדי לקבוע את הערך של משתנה הזרימה, target.url, ולאחר מכן מוודאים שאין במשתנים אחרים נתיב לא חוקי.
    3. אם מבצעים פעולות מחרוזת כלשהן כדי לקבוע את הערך של משתנה הזרימה target.url, ואז מוודאים שהתוצאה או התוצאה של המחרוזת בפעולות אין נתיב לא תקין.
  2. בדוגמאות שהוזכרו למעלה, אפשר לתקן את הבעיה כמו שמוסבר בהמשך:

    דוגמא מס' 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

    קובצי עזר

    משתנים משתנים – יעד