Wyświetlasz dokumentację Apigee Edge.
Otwórz dokumentację
Apigee X. info
Krótki opis problemu
Aplikacja kliencka otrzymuje odpowiedź HTTP 400 Bad Request z komunikatem
The plain HTTP request was sent to HTTPS port.
Komunikat o błędzie
Aplikacja kliencka otrzymuje ten kod odpowiedzi:
HTTP/1.1 400 Bad Request
A następnie tę stronę błędu HTML:
<html> <head><title>400 The plain HTTP request was sent to HTTPS port</title></head> <body> <center><h1>400 Bad Request</h1></center> <center>The plain HTTP request was sent to HTTPS port</center> </body> </html>
Możliwe przyczyny
| Przyczyna | Opis | Instrukcje rozwiązywania problemów, których dotyczy |
|---|---|---|
| Żądanie HTTP do hosta wirtualnego skonfigurowanego pod kątem TLS | Klient wysyła żądanie HTTP do hosta wirtualnego skonfigurowanego pod kątem TLS. | Użytkownicy chmury publicznej i prywatnej Edge |
| Żądanie HTTP do punktu końcowego skonfigurowanego pod kątem TLS | Żądanie HTTP wysłane do serwera backendu z włączonym TLS w punkcie końcowym. | Użytkownicy chmury publicznej i prywatnej Edge |
| Nieprawidłowa konfiguracja serwera docelowego | Serwer docelowy jest skonfigurowany z bezpiecznym portem 443, ale SSL nie jest włączony. |
Użytkownicy chmury publicznej i prywatnej Edge |
Przyczyna: żądanie HTTP do hosta wirtualnego skonfigurowanego pod kątem TLS
Ten błąd występuje, gdy klient próbuje połączyć się z interfejsem API w Apigee, a wspomniany host wirtualny jest skonfigurowany do używania SSL i zamiast tego otrzymuje żądanie HTTP.
Diagnostyka
Ponieważ ten problem występuje w punkcie końcowym Northbound, a żądania do interfejsu API kończą się niepowodzeniem w punkcie wejścia interakcji między aplikacją kliencką a routerem, te komunikaty o błędach nie są rejestrowane w dziennikach dostępu do routera NGINX. Dlatego te żądania nie będą rejestrowane w narzędziach takich jak monitorowanie interfejsu API i narzędzie do śledzenia.
-
Sprawdź żądanie do interfejsu API i zobacz, czy wysyłasz żądanie HTTP do aliasu hosta, który jest skonfigurowany tak, aby akceptować żądania tylko na bezpiecznym porcie
443. Jeśli tak, to jest to przyczyna problemu.Przykładowe nieprawidłowe żądanie do interfejsu API:
curl http://org-test.apigee.net:443/400-demo
<html> <head><title>400 The plain HTTP request was sent to HTTPS port</title></head> <body> <center><h1>400 Bad Request</h1></center> <center>The plain HTTP request was sent to HTTPS port</center> <hr><center>server</center> </body> </html>
- W powyższym przykładowym żądaniu zwróć uwagę, że żądanie HTTP jest wysyłane do aliasu hosta
myorg-test.apigee.netna bezpiecznym porcie443. Jest to przyczyna błędu400 Bad Request.
Rozwiązanie
Musisz sprawdzić, czy klient używa protokołu HTTP zamiast HTTPS, i wysłać prawidłowe żądanie, jak pokazano poniżej:
Przykładowe żądanie do interfejsu API:
curl https://org-test.apigee.net:443/400-demo
lub
curl https://org-test.apigee.net/400-demo
< HTTP/1.1 200 OK < Date: Thu, 25 Feb 2021 13:01:43 GMT < Content-Type: text/xml;charset=UTF-8 < Content-Length: 403 < Connection: keep-alive < Server: gunicorn/19.9.0 < Access-Control-Allow-Origin: * < Access-Control-Allow-Credentials: true
Przyczyna: żądanie HTTP do punktu końcowego skonfigurowanego pod kątem TLS
Ten błąd występuje, jeśli nieprawidłowo skonfigurowano żądania HTTP do serwera backendu z włączonym TLS w punkcie końcowym proxy interfejsu API.
Diagnostyka
Aby zdiagnozować błąd za pomocą narzędzia do śledzenia:
- Włącz śledzenie w interfejsie Apigee dla proxy interfejsu API, którego dotyczy problem.
- Wysyłaj żądania do proxy interfejsu API.
- Wybierz jedno z żądań do interfejsu API, które zakończyło się niepowodzeniem z kodem odpowiedzi
400. - Przejdź przez różne etapy i określ, gdzie wystąpił błąd.
-
Zwykle zobaczysz odpowiedź o błędzie
400pochodzącą z serwera backendu. Oznacza to, że odpowiedź o błędzie400zobaczysz na etapie Response received from target server (Odpowiedź otrzymana z serwera docelowego), jak pokazano poniżej:
-
Aby określić punkt końcowy, do którego wysłano żądanie, kliknij ikonę AX (Zarejestrowane dane analityczne) w śladzie.

- Zanotuj target.url, który zawiera protokół, alias hosta serwera backendu,
a czasami numer portu. Port używany w przypadku docelowego adresu URL to
443, ale protokół to HTTP. - Aby zrozumieć konfigurację, zapoznaj się z definicją punktu końcowego.
-
Sprawdź, czy host serwera backendu jest bezpieczny i nasłuchuje na bezpiecznym porcie, takim jak
443. Jeśli w elemencie<URL>używasz protokołuhttp, jest to przyczyna tego problemu.Przykładowa konfiguracja punktu końcowego:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <TargetEndpoint name="default"> <Description/> <FaultRules/> <PreFlow name="PreFlow"> <Request/> <Response/> </PreFlow> <PostFlow name="PostFlow"> <Request/> <Response/> </PostFlow> <Flows/> <HTTPTargetConnection> <Properties/> <URL>http://somehost.org:443/get</URL> </HTTPTargetConnection> </TargetEndpoint>Powyższy przykład pokazuje, że używasz protokołu HTTP, ale używany port to bezpieczny port
443. Powoduje to, że serwer backendu odpowiada komunikatem400 Bad Requesti komunikatem o błędzieThe plain HTTP request was sent to HTTPS port.
Rozwiązanie
-
Jeśli serwer backendu jest bezpieczny lub ma włączony TLS, upewnij się, że w elemencie
<URL>punktu końcowego używasz protokołu jakohttps, jak pokazano w tym przykładzie:Przykładowa konfiguracja punktu końcowego:
<HTTPTargetConnection> <Properties/> <URL>https://somehost.org:443/get</URL> </HTTPTargetConnection> -
Jeśli serwer backendu jest niezabezpieczony:
- Nie podawaj bezpiecznego numeru portu, takiego jak
443. - Jeśli serwer backendu nasłuchuje na standardowym niezabezpieczonym porcie, nie musisz w ogóle podawać numeru portu.
- Jeśli używasz innego niezabezpieczonego portu, np.
9080, podaj jego numer.
Przykładowa konfiguracja punktu końcowego:
<HTTPTargetConnection> <Properties/> <URL>http://somehost.org/get</URL> </HTTPTargetConnection> or <HTTPTargetConnection> <Properties/> <URL>http://somehost.org:9080/get</URL> </HTTPTargetConnection> - Nie podawaj bezpiecznego numeru portu, takiego jak
Przyczyna: nieprawidłowa konfiguracja serwera docelowego
Jeśli serwer docelowy jest skonfigurowany z bezpiecznym portem, takim jak 443, bez włączonego protokołu SSL, powoduje to, że procesor komunikatów Apigee Edge wysyła żądania HTTP do bezpiecznego serwera docelowego skonfigurowanego pod kątem protokołu TLS, co prowadzi do tego problemu.
Diagnostyka
Aby zdiagnozować błąd za pomocą narzędzia do śledzenia:
- Włącz śledzenie w interfejsie Apigee dla proxy interfejsu API, którego dotyczy problem.
- Wysyłaj żądania do proxy interfejsu API.
- Wybierz jedno z żądań do interfejsu API, które zakończyło się niepowodzeniem z kodem odpowiedzi
400. - Przejdź przez różne etapy i określ, gdzie wystąpił błąd.
-
Zwykle zobaczysz odpowiedź o błędzie
400pochodzącą z serwera backendu. Oznacza to, że odpowiedź o błędzie400zobaczysz na etapie Response received from target server (Odpowiedź otrzymana z serwera docelowego), jak pokazano poniżej:
-
Aby określić punkt końcowy, do którego wysłano żądanie, kliknij ikonę AX (Zarejestrowane dane analityczne) w śladzie.

-
Zanotuj target.name, który reprezentuje nazwę punktu końcowego.
W powyższym przykładowym pliku śledzenia target.name to default. Wskazuje to, że punktem końcowym używanym w tym żądaniu jest domyślny.
-
Aby zrozumieć konfigurację, zapoznaj się z definicją punktu końcowego.
Przykładowa konfiguracja punktu końcowego:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <TargetEndpoint name="default"> <Description/> <FaultRules/> <PreFlow name="PreFlow"> <Request/> <Response/> </PreFlow> <PostFlow name="PostFlow"> <Request/> <Response/> </PostFlow> <Flows/> <HTTPTargetConnection> <Properties/> <LoadBalancer> <Server name="faulty-target"/> </LoadBalancer> </HTTPTargetConnection> </TargetEndpoint>Powyższa przykładowa konfiguracja punktu końcowego pokazuje, że używasz serwera docelowego o nazwie
faulty-target. -
Gdy masz już nazwę serwera docelowego, możesz użyć jednej z tych metod, aby sprawdzić jego konfigurację:
- Interfejs Edge
- Interfejs API zarządzania Google Analytics
Interfejs Edge
- Otwórz Apigee Edge > Administracja > Środowiska > Serwery docelowe.
- Wybierz konkretny serwer docelowy zidentyfikowany przez proxy interfejsu API i kliknij Edytuj.
- Sprawdź port określony dla serwera docelowego i informacje o SSL.
-
Jeśli serwer docelowy jest skonfigurowany z bezpiecznym portem (np.
443), ale SSL nie jest włączony, jest to przyczyna tego problemu.
Jak widać na powyższym zrzucie ekranu, używany port to
443, ale SSL nie jest włączony dla tego portu w konfiguracji serwera docelowego. Powoduje to, że procesor wiadomości Apigee Edge wysyła żądania HTTP na bezpieczny port443. Dlatego otrzymujesz błąd400 Bad Requestz komunikatemThe plain HTTP request was sent to HTTPS port.
Interfejs API zarządzania Google Analytics
-
Aby uzyskać szczegółowe informacje o konfiguracji konkretnego serwera docelowego, wykonaj wywołanie interfejsu API Get target server, jak pokazano poniżej:
Użytkownik chmury publicznej:
curl -v 'https://api.enterprise.apigee.com/v1/organizations/ORG_NAME/environments/ENV_NAME>/targetservers/TARGET_SERVER_NAME' \ -H "Content-Type:application/xml" \ -H "Authorization:Bearer $TOKEN"
Użytkownik chmury prywatnej:
curl -v 'http://MANAGEMENT_IP:8080/v1/organizations/ORG_NAME/environments/ENV_NAME/targetservers/TARGET_SERVER_NAME' \ -H "Content-Type:application/xml" \ -H "Authorization:Bearer $TOKEN"
- Sprawdź port określony dla serwera docelowego i informacje o SSL.
-
Jeśli serwer docelowy jest skonfigurowany z bezpiecznym portem (np.
443), ale sekcjaSSLInfonie jest zdefiniowana lub nie jest włączona, jest to przyczyna tego problemu.Przykładowa konfiguracja serwera docelowego:
{ "host" : "somehost.org", "isEnabled" : true, "name" : "faulty-target", "port" : 443 }W powyższym przykładowym wyniku widać, że port używany do połączenia docelowego to
443, ale nie maSSLInfobloku konfiguracji.Powoduje to, że procesor komunikatów Apigee Edge wysyła żądania HTTP na bezpieczny port
443. Dlatego otrzymujesz błąd400 Bad Requestz komunikatemThe plain HTTP request was sent to HTTPS port.
Rozwiązanie
Jeśli serwer docelowy jest bezpieczny lub ma włączony TLS, musisz włączyć SSL dla konkretnego serwera docelowego.
Możesz to zrobić, korzystając z jednej z tych opcji:
- Interfejs Edge
- Interfejs API zarządzania Google Analytics
Interfejs Edge
- Otwórz serwer docelowy w interfejsie Edge > Administracja > Środowiska > Serwery docelowe.
- Wybierz konkretny serwer docelowy i kliknij Edytuj.
- Jeśli serwer docelowy jest bezpieczny i używa portu takiego jak
443, włącz SSL, zaznaczając pole wyboru obok opcji SSL. - Skonfiguruj magazyn zaufanych certyfikatów, szyfry i protokoły. (Tylko w razie potrzeby)
Interfejs API zarządzania Google Analytics
Aby skonfigurować serwer docelowy za pomocą interfejsu API zarządzania, postępuj zgodnie z instrukcjami w dokumentacji Aktualizowanie konfiguracji serwera docelowego.
Informacje diagnostyczne, które musisz zebrać
Jeśli problem nadal występuje po wykonaniu powyższych instrukcji, zbierz te 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 proxy interfejsu API
- Pełne polecenie curl do odtworzenia błędu
- Dane wyjściowe narzędzia do śledzenia (jeśli udało Ci się je zarejestrować w przypadku żądania, które zakończyło się niepowodzeniem)
- Jeśli jesteś użytkownikiem chmury prywatnej, podaj te informacje:
- Pełny komunikat o błędzie
- Nazwa środowiska
- Pakiet proxy interfejsu API
- Definicja serwera docelowego (jeśli używasz serwera docelowego w punkcie końcowym)
- Dane wyjściowe narzędzia do śledzenia (jeśli udało Ci się je zarejestrować w przypadku żądania, które zakończyło się niepowodzeniem)