500 Interner Serverfehler – BadPath

Sie sehen die Dokumentation zu Apigee Edge.
Zur Apigee X-Dokumentation
weitere Informationen

Symptom

Die Clientanwendung erhält als Antwort auf API-Aufrufe den HTTP-Statuscode 500 Internal Server Error mit dem Fehlercode protocol.http.BadPath.

Fehlermeldung

Die Clientanwendung ruft den folgenden Antwortcode ab:

HTTP/1.1 500 Internal Server Error

Außerdem wird möglicherweise die folgende Fehlermeldung angezeigt:

{
   "fault":{
      "faultstring":"Invalid request path",
      "detail":{
         "errorcode":"protocol.http.BadPath"
      }
   }
}

Mögliche Ursachen

Dieser Fehler tritt auf, wenn die Anfrage-URL des Back-End-Servers, dargestellt durch die Flussvariable target.url, ein path enthält, das mit einem Fragezeichen (?) anstelle eines Schrägstrichs (/) beginnt, was ungültig ist.

Gemäß den Spezifikationen RFC 3986, Abschnitt 3: Syntaxkomponenten und RFC 3986, Abschnitt 3.3: Pfad:

  1. Die URI-Syntax besteht aus folgenden Komponenten:

            foo://example.com:8042/over/there?name=ferret#nose
            \_/   \______________/\_________/ \_________/ \__/
             |            |            |            |       |
          scheme      authority       path        query   fragment
    
  2. Die Komponente path ist erforderlich. Sie MUSS mit beginnen und immer einen Schrägstrich (/) haben.

Wenn die Anfrage-URL des Back-End-Servers also eine path-Komponente hat, die mit einem Fragezeichen (?) anstelle eines Schrägstrichs (/) beginnt, antwortet Apigee Edge mit 500 Internal Server Error und dem Fehlercode protocol.http.BadPath.

Beispiel: Wenn target.url den Wert https://www.mocktarget.apigee.net?json hat, tritt dieser Fehler auf, da die path als ungültig erachtet wird, da sie mit einem Fragezeichen (?) statt mit einem Schrägstrich (/) beginnt.

Ursache Beschreibung Anleitungen zur Fehlerbehebung gelten für
Back-End-Server-URL (target.url) hat einen ungültigen Pfad Die Pfadkomponente in der Back-End-Server-URL, die durch die Flussvariable target.url dargestellt wird, beginnt mit einem Fragezeichen (?) anstelle eines Schrägstrichs (/). Nutzer von Edge Public und Private Cloud

Allgemeine Diagnoseschritte

Verwenden Sie eines der folgenden Tools oder Methoden, um diesen Fehler zu diagnostizieren:

API-Monitoring

Prozedur 1: API-Monitoring verwenden

So diagnostizieren Sie den Fehler mithilfe von API-Monitoring:

  1. Melden Sie sich in der Apigee Edge-UI als Nutzer mit einer entsprechenden Rolle an.
  2. Wechseln Sie zu der Organisation, in der Sie das Problem untersuchen möchten.

  3. Rufen Sie die Seite Analysieren > API-Überwachung > Untersuchen auf.
  4. Wählen Sie den Zeitraum aus, in dem Sie die Fehler beobachtet haben.
  5. Stellen Sie den Fehlercode der Zeit gegenüber.

  6. Wählen Sie eine Zelle mit dem Fehlercode protocol.http.BadPath aus, wie unten dargestellt:

  7. Informationen zum Fehlercode protocol.http.BadPath werden wie unten dargestellt angezeigt:

  8. Klicken Sie auf Logs ansehen und maximieren Sie die Zeile für die fehlgeschlagene Anfrage.

  9. Notieren Sie sich im Fenster Logs die folgenden Details:
    • Statuscode: 500
    • Fehlerquelle: target
    • Fehlercode: protocol.http.BadPath
  10. Wenn die Fehlerquelle target und der Fehlercode protocol.http.BadPath ist, bedeutet dies, dass die Back-End-Server-URL einen ungültigen Pfad hat.

Trace

Verfahren 2: Trace-Tool verwenden

So diagnostizieren Sie den Fehler mit dem Trace-Tool:

  1. Aktivieren Sie die Trace-Sitzung und entweder
    • Warten Sie, bis der Fehler 500 Internal Server Error auftritt, oder
    • Wenn Sie das Problem reproduzieren können, führen Sie den API-Aufruf aus, um das Problem zu reproduzieren. 500 Internal Server Error
  2. Achten Sie darauf, dass Show all FlowInfos aktiviert ist:

  3. Wählen Sie eine der fehlgeschlagenen Anfragen aus und prüfen Sie den Trace.
  4. Gehen Sie die verschiedenen Phasen des Trace durch und ermitteln Sie, wo der Fehler aufgetreten ist.
  5. Der Fehler tritt normalerweise in einem Ablauf nach der Phase Zielanfragefluss gestartet auf, wie unten dargestellt:

  6. Notieren Sie sich den Wert des Fehlers aus dem Trace:

    error: Ungültiger Anfragepfad

    Da der Fehler von Apigee Edge nach der Phase Zielanfragefluss gestartet ausgelöst wird, weist dies darauf hin, dass die Back-End-Server-URL einen ungültigen Pfad hat. Dies würde am wahrscheinlichsten passieren, wenn die Flussvariable target.url (die die URL für den Back-End-Server darstellt) in Apigee Edge möglicherweise mit einem ungültigen Pfad durch eine der Richtlinien im Zielanforderungsablauf aktualisiert wurde.

  7. Sehen Sie sich in jedem Ablauf den Abschnitt Gelesene und zugewiesene Variablen vom Fehlerfluss bis zur Phase Zielanfragefluss gestartet an.
  8. Bestimmen Sie die Richtlinie, in der die Flussvariable target.url aktualisiert wurde:

    Beispiel-Trace, aus dem hervorgeht, dass die JavaScript-Richtlinie die Flussvariable target.url: aktualisiert hat

    Beachten Sie im oben gezeigten Beispiel-Trace, dass der Wert der Flussvariablenvariablen target.url in einer JavaScript-Richtlinie namens JS- SetTargetURL so aktualisiert wird: target.url : https://mocktarget.apigee.net?json

  9. Beachten Sie, dass der Wert in target.url die folgenden Komponenten hat:
    • Schema:https
    • Zertifizierungsstelle:mocktarget.apigee.net
    • Pfad: ?json
  10. Da die Komponente path mit einem Fragezeichen (?) anstelle eines Schrägstrichs (/) beginnt, wird der Fehler Invalid request path ausgegeben.
  11. Gehen Sie im Trace zur Phase AX (Analytics Data Recorded) und klicken Sie darauf.
  12. Scrollen Sie nach unten zum Abschnitt Phase DetailsError Headers (Phasendetails – Fehlerheader) und ermitteln Sie die Werte von X-Apigee-Fehler-Code und X-Apigee-Fehler-Quelle, wie unten dargestellt:

  13. Die Werte für X-Apigee-fault-code und X-Apigee-fault-code werden als protocol.http.BadPath bzw. target angezeigt. Dies weist darauf hin, dass dieser Fehler verursacht wird, weil die Back-End-Server-URL einen ungültigen Pfad hat.

    Antwortheader Wert
    X-Apigee-fault-code protocol.http.BadPath
    X-Apigee-fault-source target

NGINX

Verfahren 3: NGINX-Zugriffslogs verwenden

So diagnostizieren Sie den Fehler mithilfe von NGINX-Zugriffslogs:

  1. Wenn Sie ein Private Cloud-Nutzer sind, können Sie mithilfe von NGINX-Zugriffslogs die wichtigsten Informationen zu HTTP-500 Internal Server Error ermitteln.
  2. Prüfen Sie die NGINX-Zugriffslogs:

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

  3. Suchen Sie nach 500-Fehlern mit dem Fehlercode protocol.http.BadPath während eines bestimmten Zeitraums (falls das Problem in der Vergangenheit aufgetreten ist) oder ob Anfragen immer noch mit 500 fehlschlagen.
  4. Wenn Sie 500-Fehler mit dem X-Apigee-fault-code finden, der dem Wert von X-Apigee-fault-code entspricht, bestimmen Sie den Wert von X- Apigee-Fehler-Quelle.

    Beispiel für einen 500-Fehler aus dem NGINX-Zugriffslog:

    Der obige Beispieleintrag aus dem NGINX-Zugriffslog enthält die folgenden Werte für X-Apigee-Fehler-Code und X-Apigee-Fehler-Quelle:

    Header Wert
    X-Apigee-fault-code protocol.http.BadPath
    X-Apigee-fault-source target

    Die Werte von X-Apigee-fault-code und X-Apigee-fault-code sind protocol.http.BadPath bzw. target . Dies deutet darauf hin, dass dieser Fehler verursacht wird, weil die Back-End-Server-URL einen X-Apigee-fault-code hat.

Ursache: Back-End-Server-URL (target.url) hat einen ungültigen Pfad

Diagnose

  1. Bestimmen Sie den Fehlercode und die Fehlerquelle für 500 Internal Server Error mithilfe von API-Monitoring, Trace-Tool oder NGINX-Zugriffslogs, wie unter Allgemeine Diagnoseschritte erläutert.
  2. Wenn der Fehlercode protocol.http.BadPath lautet und die Fehlerquelle den Wert target hat, weist dies darauf hin, dass die Back-End-Server-URL einen ungültigen Pfad hat.
  3. Die Back-End-Server-URL wird durch die Flussvariable target.url in Apigee Edge dargestellt. Dieser Fehler tritt in der Regel auf, wenn Sie versuchen, die Back-End-Server-URL (target.url) mit einer der Richtlinien (innerhalb des Proxy-/freigegebenen Ablaufs) im Zielanfragefluss dynamisch zu aktualisieren, sodass sie einen ungültigen Pfad enthält.

  4. Bestimmen Sie mit einer der folgenden Methoden, ob die Flussvariable target.url tatsächlich einen ungültigen Pfad und die Quelle für ihren Wert hat:

    Trace

    Trace-Tool verwenden

    Wenn Sie für diesen Fehler ein Trace erfasst haben, führen Sie die unter Trace-Tool verwenden beschriebenen Schritte aus und

    1. Prüfen Sie, ob der Pfad von target.url ungültig ist, d. h. ob er mit einem Fragezeichen (?) anstelle eines Schrägstrichs (/) beginnt.
    2. Wenn ja, ermitteln Sie die Richtlinie, die den Wert von target.url so geändert oder aktualisiert hat, dass er einen ungültigen Pfad enthält.

      Beispiel-Trace, aus dem hervorgeht, dass die JavaScript-Richtlinie die Flussvariable target.url aktualisiert hat

    3. Im obigen Beispiel-Trace sehen Sie, dass der Wert von target.url durch die JavaScript-Richtlinie so geändert oder aktualisiert wurde, dass er einen ungültigen Pfad enthält.
    4. target.url enthält die folgenden Komponenten:
      • Schema:https
      • Zertifizierungsstelle:mocktarget.apigee.net
      • Pfad: ?json

      Der Pfad beginnt mit einem Fragezeichen (?) anstelle eines Schrägstrichs (/) und ist daher ungültig.

    Logs

    Logs auf dem Logserver verwenden

    1. Wenn Sie kein Trace für diesen Fehler haben (ein vorübergehendes Problem), prüfen Sie, ob Sie die Informationen zum Wert der Flussvariablen target.url mithilfe von Richtlinien wie MessageLogging oder ServiceCallout auf Ihrem Logserver protokolliert haben.
    2. Sehen Sie sich die Protokolle an und
      1. Prüfen Sie, ob target.url einen ungültigen Pfad hat.
      2. Prüfen Sie, ob Sie die Informationen dazu ermitteln können, welche Richtlinie target.url so geändert hat, dass sie einen ungültigen Pfad enthält.

    API-Proxy

    Fehlerhaften API-Proxy prüfen

    Wenn Sie kein Trace oder keine Logs für diesen Fehler haben, prüfen Sie den ausgefallenen API-Proxy, um festzustellen, wodurch die Flussvariable target.url so geändert oder aktualisiert wurde, dass sie einen ungültigen Pfad enthält. Folgende Voraussetzungen müssen erfüllt sein:

    • Die Richtlinie im API-Proxy
    • Alle vom Proxy aufgerufenen freigegebenen Abläufe
  5. Untersuchen Sie die Richtlinie sorgfältig (z. B. „AssignMessage“ oder „JavaScript“), die die Flussvariable target.url ändert oder aktualisiert. Bestimmen Sie dann, warum target.url einen ungültigen Pfad hat.

    Im Folgenden finden Sie einige Beispielrichtlinien, die die Flussvariable target.url fälschlicherweise so aktualisieren, dass sie einen ungültigen Pfad enthält, der zu diesem Fehler führt.

    Beispiel 1

    Beispiel 1: JavaScript-Richtlinie aktualisiert die Variable target.url

    var url = "https://mocktarget.apigee.net?json"
    context.setVariable("target.url", url);
    

    Beachten Sie im obigen Beispiel, dass die Flussvariable target.url mit dem Wert https://mocktarget.apigee.net?json aktualisiert wird, der in einer anderen Variablen url. enthalten ist.

    Beachten Sie, dass der Wert von url die folgenden Komponenten hat:

    • Schema:https
    • Zertifizierungsstelle:mocktarget.apigee.net
    • Pfad: ?json

    Der Pfad beginnt mit einem Fragezeichen (?) anstelle eines Schrägstrichs (/), was ungültig ist. Daher gibt Apigee Edge 500 Internal Server Error mit dem Fehlercode protocol.http.BadPath zurück.

    Beispiel 2

    Beispiel 2: JavaScript-Richtlinie aktualisiert die Variable target.url basierend auf dem Wert im Anfrageheader

    var path = context.getVariable("request.header.Path");
    var url = "https://mocktarget.apigee.net" + path
    context.setVariable("target.url", url);
    

    Beachten Sie im obigen Beispiel, dass die Flussvariable target.url durch Verkettung des Werts https://mocktarget.apigee.net, der in einer Variablen url enthalten ist, und dem Wert einer anderen Variablen path, deren Wert von request.header.Path. abgerufen wird, aktualisiert wird.

    Wenn Sie Zugriff auf die tatsächliche Anfrage oder den tatsächlichen Trace haben, können Sie den tatsächlichen Wert prüfen, der an request.header.Path übergeben wurde.

    Beispielanfrage des Nutzers

    curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: ?user"
    

    In diesem Beispiel wird der Header-Pfad nicht als Teil der Anfrage gesendet. Daher hat die Variable path in der JavaScript-Richtlinie den Wert null.

    Das bedeutet:

    • url = https://mocktarget.apigee.net + path
    • url = https://mocktarget.apigee.net + "?user"
    • target.url = https://mocktarget.apigee.net?user

    Beachten Sie, dass der Wert von target.url die folgenden Komponenten hat:

    • Schema:https
    • Zertifizierungsstelle:mocktarget.apigee.net
    • Pfad: ?user

    Der Pfad beginnt mit einem Fragezeichen (?) anstelle eines Schrägstrichs (/), was ungültig ist. Daher gibt Apigee Edge 500 Internal Server Error mit dem Fehlercode protocol.http.BadPath zurück.

    Beispiel 3

    Beispiel 3: AssuredMessage-Richtlinie aktualisiert die Variable 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>
    

    Beachten Sie, dass der Wert von url die folgenden Komponenten hat:

    • Schema:https
    • Zertifizierungsstelle:mocktarget.apigee.net
    • Pfad: ?echo

    In diesem Beispiel beginnt der Pfad wieder mit einem Fragezeichen (?) anstelle eines Schrägstrichs (/), was ungültig ist. Daher gibt Apigee Edge 500 Internal Server Error mit dem Fehlercode protocol.http.BadPath zurück.

Auflösung

Gemäß der URL-Spezifikation RFC 3986, Abschnitt 3: Syntaxkomponenten ist die Komponente path erforderlich und MUSS immer mit "/" beginnen. Führen Sie die folgenden Schritte aus, um dieses Problem zu beheben:

  1. Achten Sie darauf, dass die Back-End-Server-URL, die durch die Flussvariable target.url dargestellt wird, immer einen gültigen Pfad hat und immer mit einem Schrägstrich (/) beginnt.
    1. Wenn der Pfad in einigen Fällen keinen Ressourcennamen enthält, muss im Pfad mindestens ein Schrägstrich (/) enthalten sein.
    2. Wenn Sie andere Variablen verwenden, um den Wert der Flussvariablen target.url zu bestimmen, achten Sie darauf, dass andere Variablen keinen ungültigen Pfad haben.
    3. Wenn Sie Stringvorgänge ausführen, um den Wert der Flussvariablen target.url zu ermitteln, achten Sie darauf, dass das Ergebnis oder Ergebnis der Stringvorgänge keinen ungültigen Pfad hat.
  2. In den oben beschriebenen Beispielen können Sie dieses Problem wie unten erläutert beheben:

    Beispiel 1

    Beispiel 1: JavaScript-Richtlinie aktualisiert die Variable target.url

    Verwenden Sie einen Schrägstrich (/) anstelle eines Fragezeichens (?) in der Variablen url, um dieses Problem so zu beheben:

    var url = "https://mocktarget.apigee.net/json"
    context.setVariable("target.url", url);
    

    Beispiel 2

    Beispiel 2: JavaScript-Richtlinie aktualisiert die Variable target.url basierend auf dem Wert im Anfrageheader

    var path = context.getVariable("request.header.Path");
    var url = "https://mocktarget.apigee.net" + path
    context.setVariable("target.url", url);
    

    Sie müssen einen gültigen Pfad übergeben (z. B. /user als Teil des Anfrageheaders Path), um dieses Problem wie unten dargestellt zu beheben:

    Beispielanfrage:

    curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /user"
    

    Beispiel 3

    Beispiel 3: AssuredMessage-Richtlinie aktualisiert die Variable target.url

    Fügen Sie im Element <Value> der Richtlinie „AssignMessage“ einen gültigen Pfad hinzu. Ersetzen Sie also das Fragezeichen (?) durch einen Schrägstrich (/) im Element <Value> und setzen Sie es auf https://mocktarget.apigee.net/echo, um dieses Problem wie unten gezeigt zu beheben:

    <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>
    

    Spezifikation

    Apigee Edge erwartet, dass die path -Komponente in der Back-End-Server-URL gemäß den folgenden Spezifikationen immer mit einem Schrägstrich (/) beginnen muss:

    Spezifikation
    RFC 3986, Abschnitt 3: Syntaxkomponenten
    RFC 3986, Abschnitt 3.3: Pfad

    Wenn Sie weiterhin Unterstützung vom Apigee-Support benötigen, lesen Sie den Abschnitt Diagnoseinformationen müssen erfasst werden.

    Erfassen von Diagnoseinformationen erforderlich

    Wenn das Problem auch nach Befolgen der obigen Anleitung weiterhin besteht, stellen Sie die folgenden Diagnoseinformationen zusammen und wenden Sie sich an den Apigee Edge-Support:

    Wenn Sie ein Public Cloud-Nutzer sind, geben Sie die folgenden Informationen an:

    • Name der Organisation
    • Name der Umgebung
    • Name des API-Proxys
    • Führen Sie den Befehl curl aus, der zum Reproduzieren von 500 Internal Server Error mit dem Fehlercode protocol.http.BadPath verwendet wurde.
    • Ablaufverfolgungsdatei für die API-Anfragen

    Wenn Sie ein Private Cloud-Nutzer sind, geben Sie die folgenden Informationen an:

    • Vollständige Fehlermeldung bei fehlgeschlagenen Anfragen
    • Name der Umgebung
    • API-Proxy-Bundle
    • Ablaufverfolgungsdatei für die API-Anfragen
    • NGINX-Zugriffslogs:

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

      Hierbei gilt: ORG, ENV und PORT# werden durch tatsächliche Werte ersetzt.

    • Systemprotokolle von Message Processor /opt/apigee/var/log/edge-message- processor/logs/system.log

    Verweise

    Flussvariablen – Ziel