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

Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
Informacje

Krótki opis problemu

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

Komunikat o błędzie

Aplikacja kliencka otrzymuje ten kod odpowiedzi:

HTTP/1.1 500 Internal Server Error

Oprócz tego może pojawić się ten 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, reprezentowany przez zmienną przepływu target.url, zawiera element path zaczynający się od znaku zapytania (?) zamiast 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 ukośnika (/) i zawsze zawierać ukośnik.

Dlatego jeśli URL żądania serwera backendu zawiera komponent path rozpoczynający się od znaku zapytania (?) zamiast ukośnika prawego (/), Apigee Edge w odpowiedzi wysyła 500 Internal Server Error i kod błędu protocol.http.BadPath.

Jeśli np. target.url zawiera wartość https://www.mocktarget.apigee.net?json, ten błąd występuje, gdy path jest nieprawidłowy, ponieważ zaczyna się od znaku zapytania (?), a nie od 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 target.url zaczyna się od znaku zapytania (?) zamiast ukośnika (/). Użytkownicy chmury publicznej i prywatnej usługi Edge

Najczęstsze kroki diagnostyki

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

Monitorowanie interfejsów API

Procedura 1. Korzystanie z monitorowania interfejsów API

Aby zdiagnozować błąd za pomocą monitorowania interfejsu API:

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

  3. Otwórz stronę Analiza > Monitorowanie interfejsów API > Zbadaj.
  4. Wybierz przedział czasu, w którym zaobserwowano błędy.
  5. Porównaj kod błędu z czasem.

  6. Wybierz komórkę z kodem błędu protocol.http.BadPath, jak pokazano poniżej:

  7. Informacje o kodzie błędu protocol.http.BadPath są wyświetlane jak 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łędu to protocol.http.BadPath, oznacza to, że adres URL serwera backendu ma nieprawidłową ścieżkę.

Trace

Procedura 2. Korzystanie z narzędzia do śledzenia

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

  1. Włącz sesję śledzenia i
    • Poczekaj na wystąpienie błędu 500 Internal Server Error lub
    • Jeśli możesz odtworzyć problem, wykonaj wywołanie interfejsu API, aby go odtworzyć. 500 Internal Server Error
  2. Sprawdź, czy opcja Show all FlowInfos (Pokaż wszystkie informacje) jest włączona:

  3. Wybierz 1 z nieudanych żądań i sprawdź log czasu.
  4. Przejdź przez różne fazy śledzenia i znajdź miejsce błędu.
  5. Błąd zwykle pojawia się w przepływie po fazie rozpoczęcia docelowego przepływu żądania , jak pokazano poniżej:

  6. Zapisz wartość błędu ze logu czasu:

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

    Ponieważ błąd jest zgłaszany przez Apigee Edge po fazie rozpoczęcia przepływu żądania docelowego, oznacza to, że adres URL serwera backendu ma nieprawidłową ścieżkę. Najczęściej dzieje się tak, gdy zmienna przepływu target.url (która reprezentuje adres URL serwera backendu) w Apigee Edge została zaktualizowana o nieprawidłową ścieżkę przez jedną z zasad w docelowym przepływie żądania.

  7. Sprawdź sekcję Zmienne odczytane i przypisane w każdym kroku wstecz od ścieżki błędu do fazy rozpoczęcia docelowego przepływu żądania.
  8. Wskaż zasadę, w której została zaktualizowana target.url zmienna przepływu:

    Przykładowy ślad pokazujący aktualizację zasady JavaScriptu target.url:

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

  9. Pamiętaj, że wartość w target.url składa się z tych komponentów:
    • schemat: https
    • autorstwo: mocktarget.apigee.net
    • ścieżka: ?json
  10. Ponieważ komponent ścieżka zaczyna się od znaku zapytania (?), a nie od ukośnika (/), pojawia się błąd Invalid request path.
  11. Przejdź do fazy AX (rejestrowane dane Analytics) w logu czasu i kliknij ją.
  12. Przewiń w dół do sekcji Szczegóły fazyNagłówki błędów i ustal wartości X-Apigee-fault-code oraz X-Apigee-fault-source, jak pokazano poniżej:

  13. Zobaczysz wartości X-Apigee-fault-code i X-Apigee-fault-source odpowiednio protocol.http.BadPath i target , wskazując, że ten błąd jest spowodowany tym, że adres URL serwera backendu ma nieprawidłową ścieżkę.

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

NGINX

Procedura 3. Używanie dziennikó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 do określenia kluczowych informacji o HTTP 500 Internal Server Error.
  2. Sprawdź logi dostępu do NGINX:

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

  3. Sprawdź, czy występują jakieś 500 błędy z kodem błędu protocol.http.BadPath w danym okresie (jeśli problem występował w przeszłości) lub czy są jakieś żądania, które nadal kończą się niepowodzeniem z 500.
  4. Jeśli znajdziesz błędy 500 z kodem X-Apigee-fault-code pasującym do wartości X-Apigee-fault-code , sprawdź wartość źródła błędów X-Apigee-fault-code .

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

    Powyższy przykładowy wpis z logu dostępu NGINX ma następujące wartości kodów X-Apigee- fault-code i X-Apigee-fault-source:

    nagłówków, Wartość
    X-Apigee-fault-code protocol.http.BadPath
    X-Apigee-fault-source target

    Zauważ, że wartości X-Apigee-fault-code i X-Apigee-fault-source to protocol.http.BadPath oraz 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 urządzenia 500 Internal Server Error za pomocą logów dostępu API Monitoring, narzędzia do śledzenia lub logów dostępu NGINX zgodnie z typowymi czynnościami diagnostycznymi.
  2. Jeśli kod błędu to protocol.http.BadPath, a źródło błędu ma wartość target, oznacza to, że adres URL serwera backendu ma nieprawidłową ścieżkę.
  3. Adres URL serwera backendu jest reprezentowany przez zmienną przepływu target.url w Apigee Edge. Ten błąd występuje zwykle wtedy, gdy próbujesz dynamicznie zaktualizować adres URL serwera backendu (target.url) przy użyciu dowolnej zasady (w ramach serwera proxy/przepływu współdzielonego) w docelowym przepływie żądań, tak aby miała nieprawidłową ścieżkę.

  4. Ustal, czy zmienna przepływu target.url rzeczywiście ma nieprawidłową ścieżkę i źródło jej wartości, korzystając z jednej z tych metod:

    Trace

    Korzystanie z narzędzia do śledzenia

    Jeśli udało Ci się zarejestrować log czasu związany z tym błędem, wykonaj czynności opisane w sekcji Używanie narzędzia do śledzenia i

    1. Sprawdź, czy adres target.url ma nieprawidłową ścieżkę, czyli czy zaczyna się od znaku zapytania (?) zamiast ukośnika (/).
    2. Jeśli tak, sprawdź zasadę, która zmodyfikowała lub zaktualizowała wartość target.url, tak aby zawierała nieprawidłową ścieżkę.

      Przykładowy ślad pokazujący aktualizację zasady JavaScriptu target.url

    3. W powyższym przykładowym logu czasu można zauważyć, że zasada JavaScript zmodyfikował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
      • autorstwo: mocktarget.apigee.net
      • ścieżka: ?json

      Ścieżka zaczyna się od znaku zapytania (?) zamiast ukośnika (/), dlatego jest nieprawidłowa.

    Logi

    Używanie dzienników na serwerze logów

    1. Jeśli nie masz logu czasu związanego z tym błędem (przejściowym problemem), sprawdź, czy zapisano na serwerze logów informacje o wartości zmiennej przepływu target.url, korzystając z takich zasad jak MessageLogging lub ServiceCallout.
    2. Jeśli masz logi, przejrzyj je i
      1. Sprawdź, czy ścieżka target.url jest nieprawidłowa i
      2. Sprawdź, czy możesz ustalić informacje o tym, która zasada zmodyfikowała target.url tak, aby zawierała nieprawidłową ścieżkę

    proxy interfejsu API

    Sprawdzanie niedziałającego serwera proxy interfejsu API

    Jeśli nie masz logu czasu ani logów dotyczących tego błędu, sprawdź serwer proxy interfejsu API, który nie działa, aby ustalić, co zmodyfikowało lub zaktualizowało zmienną przepływu target.url, tak aby zawierała nieprawidłową ścieżkę. Wykonaj te czynności:

    • Zasada w ramach serwera proxy interfejsu API
    • Wszystkie udostępnione 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 ustal przyczynę aktualizacji zasady target.url tak, aby zawierała nieprawidłową ścieżkę.

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

    Przykład 1

    Przykład 1. Zasady JavaScriptu dotyczące aktualizowania zmiennej target.url

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

    W przykładzie powyżej zmienna przepływu target.url jest aktualizowana wartością https://mocktarget.apigee.net?json znajdującą się w innej zmiennej url..

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

    • schemat: https
    • autorstwo: 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. Zasada JavaScript – aktualizowanie zmiennej target.url 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 widać, że zmienna przepływu target.url jest aktualizowana przez konkatenację wartości https://mocktarget.apigee.net zawartej w zmiennej url oraz wartości innej zmiennej path, której wartość jest pobierana z adresu request.header.Path.

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

    Przykładowe żądanie wysł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 żądaniu. Dlatego wartość zmiennej path w zasadzie JavaScriptu wynosi 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
    • autorstwo: 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 500 Internal Server Error z kodem błędu protocol.http.BadPath.

    Przykład 3

    Przykład 3. Zasady przypisywania wiadomości aktualizujące zmienną 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 składa się z tych komponentów:

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

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

Rozdzielczość

Zgodnie ze specyfikacją adresu URL RFC 3986, sekcja 3. Komponenty, komponent path jest wymagany i MUSI zawsze zaczynać się od „/”. Aby rozwiązać ten problem, wykonaj te czynności:

  1. Upewnij się, że URL serwera backendu reprezentowany przez zmienną przepływu target.url ma zawsze prawidłową ścieżkę i zawsze zaczyna się od ukośnika (/).
    1. W niektórych przypadkach nazwa zasobu w ścieżce może nie zawierać nazwy zasobu. Następnie sprawdź, czy ścieżka ma przynajmniej ukośnik (/).
    2. Jeśli do określania wartości zmiennej przepływu target.url używasz innych zmiennych, upewnij się, że nie mają one nieprawidłowej ścieżki.
    3. Jeśli wykonujesz operacje na ciągach znaków, aby określić wartość zmiennej przepływu target.url, upewnij się, że wynik operacji na ciągu znaków nie zawiera 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. Zasady JavaScriptu dotyczące aktualizowania zmiennej target.url

    Aby rozwiązać ten problem, użyj ukośnika (/) zamiast znaku zapytania (?) w zmiennej url, aby rozwiązać ten problem w podany niżej sposób:

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

    Przykład 2

    Przykład 2. Zasada JavaScript – aktualizowanie zmiennej target.url 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);
    

    Aby rozwiązać ten problem, podaj prawidłową ścieżkę, na przykład /user, w nagłówku żądania Path:

    Przykładowe żądanie:

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

    Przykład 3

    Przykład 3. Zasady przypisywania wiadomości aktualizujące zmienną target.url

    Dodaj prawidłową ścieżkę w elemencie <Value> w zasadzie AssignMessage. Aby rozwiązać ten problem, zastąp znak zapytania (?) ukośnikiem (/) w elemencie <Value> i ustaw jego wartość na 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>
    

    Specyfikacja

    Apigee Edge oczekuje, że komponent path w adresie URL serwera backendu MUSI zawsze zaczynać się od ukośnika prawego (/) zgodnie z tymi specyfikacjami:

    Specyfikacja
    RFC 3986, sekcja 3. Komponenty składni
    RFC 3986, sekcja 3.3: Ścieżka

    Jeśli nadal będziesz potrzebować pomocy zespołu pomocy Apigee, przejdź do artykułu Wymagane jest zbieranie informacji diagnostycznych.

    Musisz zebrać informacje diagnostyczne

    Jeśli problem nie ustąpi mimo wykonania powyższych instrukcji, zbierz poniższe informacje diagnostyczne i skontaktuj się z zespołem pomocy Apigee Edge:

    Jeśli jesteś użytkownikiem chmury publicznej, 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ń interfejsu API

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

    • Zaobserwowany pełny komunikat o błędzie dotyczący nieudanych żądań
    • Nazwa środowiska
    • Pakiet proxy interfejsu API
    • Plik śledzenia żądań 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 rzeczywistymi wartościami.

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

    Odniesienia

    Zmienne przepływu – cel