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 Monitoring

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

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

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

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

  7. מידע על קוד התקלה protocol.http.BadPath מוצג באופן הבא:

  8. לוחצים על View Logs (הצגת היומנים) ומרחיבים את השורה של הבקשה שנכשלה.

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

נתוני מעקב

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

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

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

  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
    • path: ?json
  10. מאחר שהרכיב path מתחיל בסימן שאלה (?) במקום בקו נטוי (/), מתקבלת הודעת השגיאה Invalid request path.
  11. מנווטים לשלב AX (רישום נתונים ב-Analytics) במעקב ולוחצים עליו.
  12. גוללים למטה לקטע Phase DetailsError Headers ומוצאים את הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source.

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

  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 תואם לערך של 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) לא תקין

אבחון

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

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

    נתוני מעקב

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

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

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

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

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

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

    יומנים

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

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

    API מסוג proxy

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

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

    • המדיניות בתוך שרת proxy ל-API
    • תהליכי עבודה משותפים שהופעלו דרך שרת ה-proxy
  5. יש לבחון בקפידה את המדיניות הספציפית (לדוגמה: 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 והוא חייב להתחיל תמיד ב-"/" . כדי לפתור את הבעיה, עליכם לפעול לפי השלבים הבאים:

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

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

    קובצי עזר

    משתני זרימה – יעד