500 – wewnętrzny błąd serwera – BadPath

Przeglądasz dokumentację Apigee Edge.
Przejdź do Dokumentacja Apigee X.
informacje.

Krótki opis problemu

Aplikacja kliencka otrzymuje kod stanu HTTP 500 Internal Server Error z kod błędu protocol.http.BadPath w odpowiedzi na wywołania interfejsu API.

Komunikat o błędzie

Aplikacja kliencka otrzymuje ten kod odpowiedzi:

HTTP/1.1 500 Internal Server Error

Możesz też zobaczyć następujący komunikat o błędzie:

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

Możliwe przyczyny

Ten błąd występuje, jeśli URL żądania serwera backendu jest reprezentowany przez zmienną przepływu target.url, zawiera element path , który zaczyna się od znaku zapytania (?) ukośnika (/), co jest nieprawidłowe.

Zgodnie ze specyfikacją RFC 3986, sekcja 3: Komponenty składni i RFC 3986, sekcja 3.3: Ścieżka:

  1. Składnia identyfikatora URI składa się z tych komponentów:

            foo://example.com:8042/over/there?name=ferret#nose
            \_/   \______________/\_________/ \_________/ \__/
             |            |            |            |       |
          scheme      authority       path        query   fragment
    
  2. Komponent path jest wymagany i MUSI zaczynać się od i zawsze musi mieć ukośnik (/).

Dlatego, jeśli URL żądania serwera backendu zawiera komponent path zaczynający się ze znakiem zapytania (?) zamiast ukośnika (/), a następnie Apigee. Edge odpowiada, podając treść 500 Internal Server Error i kod błędu protocol.http.BadPath.

Na przykład: jeśli target.url zawiera wartość https://www.mocktarget.apigee.net?json, ten błąd występuje, ponieważ Parametr path jest nieprawidłowy,ponieważ zaczyna się od znaku zapytania (?) zamiast ukośnika (/).

Przyczyna Opis Instrukcje rozwiązywania problemów dotyczące
Adres URL serwera backendu (target.url) ma nieprawidłową ścieżkę Komponent ścieżki w adresie URL serwera backendu reprezentowany przez zmienną przepływu Symbol target.url zaczyna się od znaku zapytania (?) zamiast znaku „Dalej” ukośnik (/). Użytkownicy chmury publicznej i prywatnej Edge

Typowe kroki diagnostyki

Użyj jednego z tych narzędzi lub metod, aby zdiagnozować ten błąd:

Monitorowanie interfejsów API

Procedura 1. Korzystanie z monitorowania interfejsów API

Aby zdiagnozować błąd za pomocą monitorowania interfejsów API:

  1. Zaloguj się w interfejsie Apigee Edge jako użytkownik z uprawnieniami odpowiednią rolę.
  2. Przełącz się na organizację, w której chcesz zbadać problem.

  3. Przejdź do przycisku Analiza > Monitorowanie interfejsów API > Zbadaj stronę.
  4. Wybierz okres, w którym zaobserwowano błędy.
  5. Porównaj Kod błędu z czasem.

  6. Wybierz komórkę, która ma podany kod błędu protocol.http.BadPath poniżej:

  7. Informacje o kodzie błędu protocol.http.BadPath są wyświetlane jako poniżej:

  8. Kliknij Wyświetl logi i rozwiń wiersz nieudanego żądania.

  9. W oknie Logi zwróć uwagę na te informacje:
    • Kod stanu: 500
    • Źródło błędu: target
    • Kod błędu: protocol.http.BadPath
  10. Jeśli Źródło błędu to target, a Kod błęduprotocol.http.BadPath, oznacza to, że adres URL serwera backendu zawiera ciąg nieprawidłowa ścieżka.

Śledzenie

Procedura 2. Używanie narzędzia śledzenia

Aby zdiagnozować błąd za pomocą narzędzia śledzenia:

  1. Włącz sesję śledzenia i wykonaj jedną z tych czynności:
    • Poczekaj, aż wystąpi błąd 500 Internal Server Error lub
    • Jeśli możesz odtworzyć problem, wykonaj wywołanie interfejsu API, aby odtworzyć problem. 500 Internal Server Error
  2. Sprawdź, czy opcja Show all FlowInfos jest włączona:

  3. Wybierz jedno z nieudanych żądań i sprawdź log czasu.
  4. Przejdź przez różne fazy śledzenia i znajdź miejsca, w których wystąpił błąd.
  5. Błąd pojawia się zwykle w ramach procesu po rozpoczęciu docelowego przepływu żądań . faza, jak poniżej:

  6. Zwróć uwagę na wartość błędu ze logu czasu:

    Błąd: nieprawidłowa ścieżka żądania

    Błąd jest zgłaszany przez Apigee Edge po rozpoczęciu docelowego przepływu żądań oznacza, że adres URL serwera backendu ma nieprawidłową ścieżkę. To spowoduje najczęściej występuje, jeśli zmienna przepływu target.url (która reprezentuje adres URL dla serwera backendu) w Apigee Edge prawdopodobnie została zaktualizowana o nieprawidłową ścieżkę przez jedną z zasad w docelowym przepływie żądań.

  7. W każdym procesie odwrotnym sprawdź sekcję Zmienne przeczytane i przypisane. od procesu błędu do fazy rozpoczęcia docelowego przepływu żądań.
  8. Ustal zasadę, gdzie zmienna przepływu target.url była zaktualizowano:

    Przykładowy log czasu pokazujący, jak zasada JavaScript zaktualizowała zmienną przepływu target.url:

    W przykładowym logu czasu powyżej zwróć uwagę na wartość zmiennej przepływu Plik target.url w zasadzie JavaScript o nazwie JS- SetTargetURL został zaktualizowany w następujący sposób: target.url : https://mocktarget.apigee.net?json

  9. Pamiętaj, że wartość w polu target.url składa się z tych komponentów:
      .
    • schemat: https
    • autoryzacja: mocktarget.apigee.net
    • ścieżka: ?json
  10. Komponent ścieżka zaczyna się od znaku zapytania (?) zamiast ukośnika (/), pojawia się błąd Invalid request path.
  11. Przejdź do fazy AX (zarejestrowane dane Analytics) i kliknij ją.
  12. Przewiń w dół do sekcji Phase DetailsError Headers (Nagłówki błędów) i określ wartość wartości X-Apigee-fault-code i X-Apigee-fault-source, jak pokazano poniżej:

  13. Zobaczysz wartości X-Apigee-fault-code i X-Apigee-fault-source jak protocol.http.BadPath i target , wskazujący, że ten błąd jest spowodowany nieprawidłową ścieżką adresu URL serwera backendu.

    Nagłówki odpowiedzi Wartość
    X-Apigee-fault-code protocol.http.BadPath
    X-Apigee-fault-source target

NGINX

Procedura 3. Używanie logów dostępu NGINX

Aby zdiagnozować błąd przy użyciu logów dostępu NGINX:

  1. Jeśli jesteś użytkownikiem Private Cloud, możesz użyć logów dostępu NGINX, aby określić Kluczowe informacje o HTTP 500 Internal Server Error.
  2. Sprawdź logi dostępu NGINX:

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

  3. Wyszukaj błędy (500) z kodem błędu protocol.http.BadPath w określonym czasie (jeśli problem wystąpił w wcześniejsze) lub jeśli jakieś żądania z usługą 500 nadal kończą się niepowodzeniem.
  4. Jeśli znajdziesz błędy 500 w dopasowaniu X-Apigee-fault-code wartość protocol.http.BadPath, a następnie ustal wartość X- Źródło usterek Apigee.

    Przykładowy błąd 500 z dziennika dostępu NGINX:

    Powyższy przykładowy wpis z logu dostępu NGINX zawiera następujące wartości dla X-Apigee- kod błędu i X-Apigee-fault-source:

    Nagłówki Wartość
    X-Apigee-fault-code protocol.http.BadPath
    X-Apigee-fault-source target

    Zwróć uwagę, że wartości X-Apigee-fault-code i X-Apigee-fault-source to protocol.http.BadPath i target , co oznacza że ten błąd jest spowodowany tym, że adres URL serwera backendu ma nieprawidłową ścieżkę.

Przyczyna: adres URL serwera backendu (target.url) ma nieprawidłową ścieżkę

Diagnostyka

  1. Określ kod błędu i źródło błędu dla 500 Internal Server Error przy użyciu monitorowania interfejsów API, narzędzia Trace Tool lub logów dostępu NGINX, jak opisano w sekcji Najczęstsze czynności diagnostyczne.
  2. Jeśli Kod błędu to protocol.http.BadPath, a Źródło błędu – wartość target, oznacza to, że adres URL serwera backendu zawiera nieprawidłowy parametr .
  3. URL serwera backendu jest w Apigee reprezentowany przez zmienną przepływu target.url Edge. Ten błąd zwykle występuje przy próbie zaktualizowania adresu URL serwera backendu (target.url) dynamicznie przy użyciu zasad (w serwer proxy/współdzielony) w procesie żądania docelowego tak, aby zawierał nieprawidłową ścieżkę.

  4. Sprawdź, czy zmienna przepływu target.url rzeczywiście zawiera nieprawidłową path i źródło jego wartości, korzystając z jednej z tych metod:

    Śledzenie

    Korzystanie z narzędzia Trace

    Jeśli masz zarejestrowany ślad tego błędu, wykonaj czynności opisane w za pomocą narzędzia Trace .

    1. Sprawdź, czy ścieżka target.url ma nieprawidłową ścieżkę, czyli zaczyna się ze znakiem zapytania (?) zamiast ukośnika (/).
    2. Jeśli tak, dowiedz się, która zasada zmodyfikowała lub zaktualizowała wartość target.url, aby uwzględnić nieprawidłową ścieżkę.

      Przykładowy log czasu pokazujący, jak zasada JavaScript zaktualizowała zmienną przepływu target.url

    3. W tym przykładowym logu czasu widać, że zasada JavaScript zmieniła lub zaktualizowała wartość target.url, tak aby zawierała nieprawidłową ścieżkę.
    4. Pamiętaj, że target.url zawiera te komponenty:
        .
      • schemat: https
      • autoryzacja: mocktarget.apigee.net
      • ścieżka: ?json

      Ścieżka zaczyna się od znaku zapytania (?), a nie od znaku „Dalej”. ukośnik (/), dlatego jest nieprawidłowy.

    Logi

    Używanie logów na serwerze logów

    1. Jeśli nie ma śladów tego błędu (problem przejściowy), sprawdź, czy zapisałeś informacje o wartości zmiennej Flow target.url przy użyciu zasad takich jak MessageLogging lub . zasady ServiceCallout na serwerze logów.
    2. Jeśli masz dzienniki, przejrzyj je
      1. Sprawdź, czy ścieżka target.url jest nieprawidłowa.
      2. Zobacz, czy możesz określić informacje o tym, które zasady zostały zmodyfikowane Plik target.url zawiera nieprawidłową ścieżkę

    proxy interfejsu API

    Sprawdzanie uszkodzonego serwera proxy interfejsu API

    Jeśli nie masz logu czasu ani logów dla tego błędu, sprawdź interfejs API, w którym wystąpił błąd serwera proxy, by określić, co zmodyfikowało lub zaktualizowało zmienną przepływu target.url zawiera nieprawidłową ścieżkę. Sprawdź poniższe kwestie:

    • Zasada w obrębie serwera proxy interfejsu API
    • Wszystkie współdzielone przepływy wywoływane z serwera proxy
  5. Dokładnie sprawdź konkretną zasadę (np. AssignMessage lub JavaScript), która modyfikuje lub aktualizuje zmienną przepływu target.url i określa przyczynę dla aktualizujesz target.url, aby miał nieprawidłową ścieżkę.

    Oto kilka przykładowych zasad, które aktualizują zmienną przepływu target.url zawiera nieprawidłową ścieżkę prowadzącą do tego błędu.

    Przykład 1

    Przykład 1. Aktualizacja zmiennej target.url przez zasadę JavaScriptu

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

    W powyższym przykładzie zwróć uwagę, że zmienna przepływu target.url została zaktualizowana z wartością https://mocktarget.apigee.net?json zawartą w innej zmienna url.

    Pamiętaj, że wartość url składa się z tych komponentów:

    • schemat: https
    • autoryzacja: mocktarget.apigee.net
    • ścieżka: ?json

    Ścieżka zaczyna się od znaku zapytania (?) zamiast ukośnika (/), co jest nieprawidłowe. Dlatego Apigee Edge zwraca 500 Internal Server Error z kodem błędu protocol.http.BadPath.

    Przykład 2

    Przykład 2. Aktualizacja zmiennej target.url przez zasadę JavaScriptu na podstawie wartości w nagłówku żądania

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

    W powyższym przykładzie zwróć uwagę, że zmienna przepływu target.url została zaktualizowana przez połączenie wartości https://mocktarget.apigee.net zawartej w url i wartości innej zmiennej path, , której wartość jest pobierana z request.header.Path.

    Jeśli masz dostęp do rzeczywistego żądania lub logu czasu, możesz sprawdzić rzeczywistą wartość przekazano do request.header.Path.

    Przykładowe żądanie przesłane przez użytkownika

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

    W tym przykładzie ścieżka nagłówka nie jest wysyłana w ramach żądania. Dlatego też wartość zmiennej path w zasadzie JavaScript to null.

    Przykłady:

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

    Pamiętaj, że wartość target.url składa się z tych komponentów:

    • schemat: https
    • autoryzacja: mocktarget.apigee.net
    • ścieżka: ?user

    Ścieżka zaczyna się od znaku zapytania (?) zamiast ukośnika (/), co jest nieprawidłowe. Z tego powodu Apigee Edge zwraca wartość 500 Internal Server Error z kodem błędu protocol.http.BadPath.

    Przykład 3

    Przykład 3. Aktualizacja zasady AssignMessage z aktualizacją zmiennej 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>
    

    Pamiętaj, że wartość url obejmuje te komponenty:

    • schemat: https
    • autoryzacja: mocktarget.apigee.net
    • ścieżka: ?echo

    W tym przykładzie ścieżka zaczyna się od znaku zapytania (?) zamiast ukośnika (/), co jest nieprawidłowe. Dlatego Apigee Edge zwraca wartość 500 Internal Server Error z kodem błędu protocol.http.BadPath

Rozdzielczość

Zgodnie ze specyfikacją adresu URL RFC 3986, sekcja 3: Komponenty składni, komponent path jest wymagany i MUSI zawsze zaczynać się od "/". Aby rozwiązać ten problem:

  1. Sprawdź, czy adres URL serwera backendu reprezentowany przez zmienną przepływu target.url ma zawsze prawidłową ścieżkę i zawsze zaczyna się od ukośnik prawy (/).
    1. W niektórych przypadkach ścieżka może nie zawierać nazwy zasobu. Sprawdź, czy tag ścieżka musi zawierać co najmniej ukośnik (/).
    2. Jeśli używasz innych zmiennych do określenia wartości zmiennej przepływu target.url, upewnij się, że inne zmienne nie mają podanego parametru nieprawidłową ścieżkę.
    3. Jeśli wykonujesz operacje na ciągach znaków, aby określić wartość zmiennej przepływu target.url, a następnie sprawdź, czy wynik lub wynik ciągu znaków operacje nie mają nieprawidłowej ścieżki.
  2. W przykładach opisanych powyżej możesz rozwiązać ten problem w sposób opisany poniżej:

    Przykład 1

    Przykład 1. Aktualizacja zmiennej target.url przez zasadę JavaScriptu

    Użyj ukośnika (/) zamiast znaku zapytania (?) w url, aby rozwiązać ten problem, jak pokazano poniżej:

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

    Przykład 2

    Przykład 2. Aktualizacja zmiennej target.url przez zasadę JavaScriptu na podstawie wartości w nagłówku żądania

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

    Upewnij się, że przekazujesz prawidłową ścieżkę, np. /user jako część żądania nagłówek Path, aby rozwiązać ten problem, jak pokazano poniżej:

    Przykładowe żądanie:

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

    Przykład 3

    Przykład 3. Aktualizowanie zmiennej target.url przez zasadę AssignMessage

    Dodaj prawidłową ścieżkę w elemencie <Value> zasady AssignMessage. Oznacza to, że znak zapytania (?) zastąp ukośnik prawy (/) w elemencie <Value> i ustaw wartość https://mocktarget.apigee.net/echo, aby rozwiązać ten problem, jak pokazano poniżej:

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

    Specyfikacja

    Apigee Edge oczekuje, że path komponent w adresie URL serwera backendu MUSI zawsze zaczynać się od ukośnika (/) w następujący sposób: specyfikacje:

    Specyfikacja
    RFC 3986, sekcja 3: komponenty składni
    RFC 3986, sekcja 3.3: ścieżka

    Jeśli nadal potrzebujesz pomocy zespołu pomocy Apigee, przejdź do sekcji Musisz zebrać informacje diagnostyczne.

    Musi zbierać informacje diagnostyczne

    Jeśli po wykonaniu powyższych czynności problem nie ustąpi, zwróć uwagę na informacje diagnostyczne, a następnie skontaktuj się z zespołem pomocy Apigee Edge:

    Jeśli jesteś użytkownikiem Public Cloud, podaj te informacje:

    • Nazwa organizacji
    • Nazwa środowiska
    • Nazwa serwera proxy interfejsu API
    • Wykonaj polecenie curl użyte do odtworzenia elementu 500 Internal Server Error z kodem błędu protocol.http.BadPath
    • Plik śledzenia żądań do interfejsu API

    Jeśli jesteś użytkownikiem Private Cloud, podaj te informacje:

    • Pełny komunikat o błędzie zaobserwowany dla nieudanych żądań
    • Nazwa środowiska
    • Pakiet serwerów proxy interfejsu API
    • Plik śledzenia żądań do interfejsu API
    • Logi dostępu NGINX:

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

      Gdzie: ORG, ENV i PORT# są zastępowane przez wartości rzeczywiste.

    • Dzienniki systemowe procesora wiadomości /opt/apigee/var/log/edge-message- processor/logs/system.log

    Pliki referencyjne

    Zmienne przepływu – cel