500 Interner Serverfehler – Leerer Pfad

Sie lesen gerade die Dokumentation zu Apigee Edge.
Apigee X-Dokumentation aufrufen
info

Symptom

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

Fehlermeldung

Die Clientanwendung erhält den folgenden Antwortcode:

HTTP/1.1 500 Internal Server Error

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

{
   "fault":{
      "faultstring":"Request path cannot be empty",
      "detail":{
         "errorcode":"protocol.http.EmptyPath"
      }
   }
}

Mögliche Ursachen

Dieser Fehler tritt auf, wenn die Anfrage-URL des Backend-Servers, die durch die Ablaufvariable target.url dargestellt wird, einen leeren Pfad enthält.

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

  1. Die URI-Syntax besteht aus den folgenden Komponenten:

            foo://example.com:8042/over/there?name=ferret#nose
            \_/   \______________/\_________/ \_________/ \__/
             |            |            |            |       |
          scheme      authority       path        query   fragment
    
  2. Die Komponente path ist erforderlich und MUSS immer einen Schrägstrich (/) enthalten, auch wenn der Pfad keine anderen Zeichen enthält.

Wenn die Anfrage-URL des Backend-Servers also überhaupt keine path-Komponente hat, d. h. nicht einmal einen Schrägstrich (/), antwortet Apigee Edge mit 500 Internal Server Error und dem Fehlercode protocol.http.EmptyPath.

Beispiel: Wenn target.url den Wert https://www.mocktarget.apigee.net hat, tritt dieser Fehler auf, da die path -Komponente leer ist oder fehlt.

Ursache Beschreibung Anleitungen zur Fehlerbehebung gelten für
Die URL des Backend-Servers (target.url) hat einen leeren Pfad Die Backend-Server-URL, die durch die Ablaufvariable target.url dargestellt wird, hat einen leeren Pfad. Nutzer der Edge Public und Private Cloud

Allgemeine Diagnoseschritte

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

API-Monitoring

Methode 1: API-Monitoring verwenden

So diagnostizieren Sie den Fehler mit API Monitoring:

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

  3. Rufen Sie die Seite Analysieren > API-Monitoring > Untersuchen auf.
  4. Wählen Sie den Zeitraum aus, in dem die Fehler aufgetreten sind.
  5. Stellen Sie den Fehlercode im Vergleich zur Zeit dar.

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

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

  8. Klicken Sie auf Logs ansehen , um die Zeile für die fehlgeschlagene Anfrage zu maximieren.

  9. Notieren Sie sich im Fenster Logs die folgenden Details:
    • Statuscode:500
    • Fehlerquelle: target
    • Fehlercode:protocol.http.EmptyPath
  10. Wenn die Fehlerquelle target und der Fehlercode protocol.http.EmptyPath ist, bedeutet das, dass die Backend-Server-URL einen leeren Pfad hat.

Trace

Vorgehensweise 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.
    • Wenn Sie das Problem reproduzieren können, führen Sie den API-Aufruf aus, um das Problem zu reproduzieren. 500 Internal Server Error
  2. Prüfen Sie, ob Alle FlowInfos anzeigen aktiviert ist:

  3. Wählen Sie eine der fehlgeschlagenen Anfragen aus und sehen Sie sich den Trace an.
  4. Navigieren Sie durch die verschiedenen Phasen des Traces und suchen Sie nach der Stelle, an der der Fehler aufgetreten ist.
  5. Der Fehler tritt in der Regel in einem Ablauf nach der Phase Target Request Flow Started auf, wie unten dargestellt:

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

    error: Request path cannot be empty (Fehler: Der Anfragepfad darf nicht leer sein)

    Da der Fehler von Apigee Edge nach der Phase Target Request Flow Started (Zielanfrage-Ablauf gestartet) ausgelöst wird, weist er darauf hin, dass path in der Backend-Server-URL leer ist. Dies geschieht höchstwahrscheinlich, wenn die Ablaufvariable target.url (die die URL für den Backend-Server darstellt) durch eine der Richtlinien im Anfrageablauf mit einem leeren Pfad aktualisiert wurde.

  7. Sehen Sie sich den Abschnitt Variables Read and Assigned (Variablen gelesen und zugewiesen) in jedem der Abläufe rückwärts vom Fehlerpunkt bis zur Phase Target Request Flow Started (Zielanfrageablauf gestartet) an.
  8. Ermitteln Sie die Richtlinie, in der die Ablaufvariable target.url aktualisiert wird.

    Beispiel-Trace, in dem die Ablaufvariable target.url durch die JavaScript-Richtlinie aktualisiert wurde:

    Im oben gezeigten Beispiel-Trace wird der Wert der Ablaufvariablen target.url in einer JavaScript-Richtlinie mit dem Namen SetTargetURL so aktualisiert:

    target.url : https://mocktarget.apigee.net
  9. target.url hat die folgenden Komponenten:
    • Schema:https://mocktarget.apigee.net
    • path:leer
  10. Daher erhalten Sie die Fehlermeldung Request path cannot be empty.
  11. Suchen Sie im Trace nach der Phase AX (Analytics Data Recorded) und klicken Sie darauf.
  12. Scrollen Sie nach unten zum Abschnitt Phasendetails – Fehlerheader und ermitteln Sie die Werte von X-Apigee-fault-code und X-Apigee-fault-source, wie unten dargestellt:

  13. Die Werte von X-Apigee-fault-code und X-Apigee-fault-source sind protocol.http.EmptyPath bzw. target . Das bedeutet, dass dieser Fehler auftritt, weil die Backend-Server-URL einen leeren Pfad hat.
    Antwortheader Wert
    X-Apigee-fault-code protocol.http.EmptyPath
    X-Apigee-fault-source target

NGINX

Verfahren 3: NGINX-Zugriffsprotokolle verwenden

So diagnostizieren Sie den Fehler mithilfe von NGINX-Zugriffslogs:

  1. Wenn Sie Private Cloud-Nutzer sind, können Sie die NGINX-Zugriffsprotokolle verwenden, um die wichtigsten Informationen zu HTTP 500 Internal Server Error zu ermitteln.
  2. NGINX-Zugriffslogs prüfen:

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

  3. Suchen Sie nach 500-Fehlern mit dem Fehlercode protocol.http.EmptyPath in einem bestimmten Zeitraum (wenn das Problem in der Vergangenheit aufgetreten ist) oder nach Anfragen, bei denen weiterhin 500-Fehler auftreten.
  4. Wenn Sie 500-Fehler mit dem X-Apigee-fault-code finden, der mit dem Wert von protocol.http.EmptyPath übereinstimmt, ermitteln Sie den Wert von X-Apigee-fault-source.

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

    Der obige Beispiel-Eintrag aus dem NGINX-Zugriffslog hat die folgenden Werte für X-Apigee-fault-code und X-Apigee-fault-source:

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

    Die Werte von X-Apigee-fault-code und X-Apigee-fault-source sind protocol.http.EmptyPath bzw. target . Das bedeutet, dass dieser Fehler durch einen leeren Pfad in der Backend-Server-URL verursacht wird.

Ursache: Die Backend-Server-URL (target.url) hat einen leeren Pfad.

Diagnose

  1. Ermitteln Sie den Fehlercode und die Fehlerquelle für 500 Internal Server Error mithilfe von API Monitoring, Trace Tool oder NGINX-Zugriffsprotokollen, wie in Häufige Diagnoseschritte beschrieben.
  2. Wenn der Fault Code (Fehlercode) protocol.http.EmptyPath und der Fault Source (Fehlerquelle) den Wert target hat, bedeutet das, dass die Backend-Server-URL einen leeren Pfad hat.
  3. Die URL des Backend-Servers wird in Apigee Edge durch die Ablaufvariable target.url dargestellt. Dieser Fehler tritt in der Regel auf, wenn Sie versuchen, die Backend-Server-URL, d. h. target.url, dynamisch mit einer der Richtlinien (im Proxy-/freigegebenen Ablauf) im Zielanfrageablauf zu aktualisieren, sodass sie einen leeren Pfad hat.

  4. Prüfen Sie mit einem der folgenden Schritte, ob die Ablaufvariable target.url tatsächlich einen leeren Pfad und die Quelle für ihren Wert hat:

    Trace

    Trace-Tool verwenden

    Wenn Sie einen Trace für diesen Fehler erfasst haben, gehen Sie so vor, wie unter Trace-Tool verwenden beschrieben:

    1. Prüfen Sie, ob target.url einen leeren Pfad hat.
    2. Wenn ja, ermitteln Sie, durch welche Richtlinie der Wert von target.url so geändert oder aktualisiert wurde, dass er einen leeren Pfad enthält.

      Beispiel-Trace, in dem die Ablaufvariable target.url: durch die JavaScript-Richtlinie aktualisiert wurde

    3. Im obigen Beispiel-Trace sehen Sie, dass die JavaScript-Richtlinie den Wert von target.url so geändert oder aktualisiert hat, dass er einen leeren Pfad enthält.
    4. target.url hat die folgenden Komponenten:
      • Schema:https://mocktarget.apigee.net
      • path:leer

    Logs

    Logs auf Ihrem Log-Server verwenden

    1. Wenn Sie keinen Trace für diesen Fehler haben (ein zeitweiliges Problem), prüfen Sie, ob Sie die Informationen zum Wert der Ablaufvariablen target.url mit Richtlinien wie MessageLogging oder ServiceCallout auf Ihrem Logserver protokolliert haben.
    2. Wenn Sie die Logs haben, prüfen Sie sie und gehen Sie so vor:
      1. Prüfen Sie, ob target.url einen leeren Pfad hat.
      2. Prüfen Sie, ob Sie ermitteln können, durch welche Richtlinie target.url so geändert wurde, dass sie einen leeren Pfad enthält.

    API-Proxy

    Fehlerhaften API-Proxy prüfen

    Wenn Sie keinen Trace oder keine Logs für diesen Fehler haben, prüfen Sie den fehlerhaften API-Proxy, um festzustellen, wodurch die Ablaufvariable target.url so geändert oder aktualisiert wurde, dass sie einen ungültigen Pfad enthält. Dann machen Sie Folgendes:

    • Die Richtlinie im API-Proxy
    • Alle freigegebenen Abläufe, die vom Proxy aufgerufen werden
  5. Sehen Sie sich die Richtlinie (z. B. AssignMessage oder JavaScript) an, die die Ablaufvariable target.url ändert oder aktualisiert, und ermitteln Sie die Ursache dafür, dass target.url einen leeren Pfad hat.

    Hier sind einige Beispielrichtlinien, die die Ablaufvariable target.url fälschlicherweise so aktualisieren, dass sie einen leeren Pfad enthält, was zu diesem Fehler führt.

    Beispiel 1

    Beispiel 1: Aktualisieren der target.url-Variablen in der JavaScript-Richtlinie

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

    Im obigen Beispiel wird die Ablaufvariable target.url mit dem Wert https://mocktarget.apigee.net aktualisiert, der in einer anderen Variablen url enthalten ist.

    target.url hat die folgenden Komponenten:

    • Schema:https://mocktarget.apigee.net
    • path:leer

    Da der Pfad leer ist, gibt Apigee Edge 500 Internal Server Error mit dem Fehlercode protocol.http.EmptyPath zurück.

    Beispiel 2

    Beispiel 2: Aktualisieren der JavaScript-Richtlinienvariablen target.url

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

    Im obigen Beispiel wird die Ablaufvariable target.url aktualisiert, indem der Wert https://mocktarget.apigee.net, der in einer Variablen url enthalten ist, mit dem Wert einer anderen Variablen path verkettet wird, deren Wert aus request.header.Path. abgerufen wird.

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

    Beispiel für eine vom Nutzer gestellte Anfrage:

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

    In diesem Beispiel wird der Headerpfad nicht als Teil der Anfrage gesendet. Daher ist der Wert des Variablenpfads in der JavaScript-Richtlinie null.

    Das bedeutet:

    • url = https://mocktarget.apigee.net + path
    • url = https://mocktarget.apigee.net + null
    • target.url = https://mocktarget.apigee.netnull

    target.url hat die folgenden Komponenten:

    • Schema:https://mocktarget.apigee.netnull
    • path:leer

    Beispiel 3

    Beispiel 3: AssignMessage-Richtlinie, die die Variable target.url über eine andere Variable aktualisiert

    <AssignMessage async="false" continueOnError="false" enabled="true" name=">AM-SetTargetURL">
        <DisplayName>AM-SetTargetURL</DisplayName>
        <AssignVariable>
             <Name>target.url</Name>
             <Value>https://mocktarget.apigee.net</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>

    target.url hat die folgenden Komponenten:

    • Schema:https://mocktarget.apigee.net
    • path:leer

    In allen oben genannten Beispielen ist der Pfad in der Backend-Server-URL, also target.url, leer. Daher gibt Apigee Edge 500 Internal Server Error mit dem Fehlercode protocol.http.EmptyPath zurück.

Auflösung

Gemäß der Spezifikation RFC 3986, Abschnitt 2: Syntaxkomponenten ist die Komponente path erforderlich und muss immer einen Schrägstrich (/) enthalten, auch wenn keine anderen Zeichen Teil von path sind. So beheben Sie das Problem:

  1. Achten Sie darauf, dass die Backend-Server-URL, die durch die Ablaufvariable target.url dargestellt wird, immer einen nicht leeren Pfad hat.
    1. In einigen Fällen ist im Pfad kein Ressourcenname enthalten. Achten Sie dann darauf, dass der Pfad mindestens einen Schrägstrich (/) enthält.
    2. Wenn Sie andere Variablen verwenden, um den Wert der Ablaufvariablen target.url zu bestimmen, dürfen diese Variablen keinen leeren Pfad haben.
    3. Wenn Sie String-Operationen ausführen, um den Wert der Ablaufvariablen target.url zu ermitteln, achten Sie darauf, dass das Ergebnis oder der Ausgang der String-Operationen keinen leeren Pfad hat.
  2. In den im Abschnitt Diagnose besprochenen Beispielen können Sie dieses Problem wie unten beschrieben beheben:

    Beispiel 1

    Beispiel 1: Aktualisieren der target.url-Variablen in der JavaScript-Richtlinie

    Fügen Sie der Variablen url einen Schrägstrich (/) hinzu, um dieses Problem zu beheben, wie unten dargestellt:

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

    Beispiel 2

    Beispiel 2: Aktualisieren der JavaScript-Richtlinienvariablen target.url

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

    Achten Sie darauf, dass Sie einen gültigen Pfad, z. B. /iloveapis, als Teil des Anfrageheaders Path übergeben, um dieses Problem zu beheben. Beispiel:

    Beispielanfrage:

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

    Beispiel 3

    Beispiel 3: AssignMessage-Richtlinie, mit der die Variable target.url über eine andere Variable aktualisiert wird

    Fügen Sie im Element <Value> der AssignMessage-Richtlinie einen gültigen Pfad hinzu. Sie können beispielsweise /json als Pfad für die MockTarget API verwenden. Ändern Sie das <Value>-Element in https://mocktarget.apigee.net/json, wie unten gezeigt:

    <AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL">
        <DisplayName>AM-SetTargetURL</DisplayName>
        <AssignVariable>
             <Name>target.url</Name>
             <Value>https://mocktarget.apigee.net/json</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>

Spezifikation

Apigee Edge erwartet, dass die Backend-Server-URL gemäß den folgenden Spezifikationen keinen leeren Pfad hat:

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

Wenn Sie weiterhin Unterstützung vom Apigee-Support benötigen, gehen Sie zu Erfassen von Diagnoseinformationen erforderlich.

Erfassen von Diagnoseinformationen erforderlich

Wenn das Problem auch nach Befolgen der obigen Anweisungen weiterhin besteht, sammeln Sie die folgenden Diagnoseinformationen und wenden Sie sich dann 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
  • Vollständiger curl-Befehl, der zum Reproduzieren des 500 Internal Server Error mit dem Fehlercode protocol.http.EmptyPath verwendet wurde
  • Trace-Datei für die API-Anfragen

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

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

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

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

  • Systemprotokolle des Message Processors /opt/apigee/var/log/edge-message- processor/logs/system.log

Verweise

Ablaufvariablen – Ziel