Stai visualizzando la documentazione di Apigee Edge.
Consulta la
documentazione di Apigee X. info
Sintomo
L'applicazione client riceve un codice di stato HTTP 502 Bad Gateway con il codice di errore
protocol.http.DuplicateHeader come risposta alle chiamate API.
Messaggio di errore
L'applicazione client riceve il seguente codice di risposta:
HTTP/1.1 502 Bad Gateway
Inoltre, potresti visualizzare un messaggio di errore simile a quello mostrato di seguito:
{
"fault":{
"faultstring":"Duplicate Header \"Expires\"",
"detail":{
"errorcode":"protocol.http.DuplicateHeader"
}
}
}Possibili cause
Questo errore si verifica se un'intestazione HTTP specifica, per la quale non sono consentiti duplicati in Apigee Edge, viene visualizzata più di una volta con valori uguali o diversi, come parte della risposta HTTP inviata dal server di backend ad Apigee Edge.
In base alla
sezione 3.2.2: Field Orderdella RFC 7230, un mittente NON DEVE generare più campi di intestazione con lo stesso nome di campo in un messaggio, a meno che l'intero valore del campo per quel campo di intestazione non sia definito come un elenco separato da virgole, [ovvero #(values)] o il campo di intestazione non sia un'
eccezione nota. Se Apigee Edge rileva che una stessa intestazione specifica, per la quale non sono consentiti duplicati, viene inviata più di una volta nella risposta HTTP inviata dal server di destinazione/backend, risponde con 502 Bad Gateway e il codice di errore protocol.http.DuplicateHeader
Di seguito sono riportate le possibili cause di questo errore:
| Causa | Descrizione | Istruzioni per la risoluzione dei problemi applicabili per |
|---|---|---|
| Intestazione duplicata nella risposta | La risposta del server di backend contiene intestazioni duplicate. | Utenti di Edge Public Cloud e Private Cloud |
Passaggi comuni per la diagnosi
Utilizza uno dei seguenti strumenti/tecniche per diagnosticare questo errore:
Monitoraggio delle API
Per diagnosticare l'errore utilizzando il monitoraggio delle API:
- Accedi all'interfaccia utente di Apigee Edge come utente con un ruolo appropriato.
Passa all'organizzazione in cui vuoi esaminare il problema.

- Vai alla pagina Analizza > Monitoraggio API > Esamina.
- Seleziona l'intervallo di tempo specifico in cui hai osservato gli errori.
- Assicurati che il filtro Proxy sia impostato su Tutti.
- Traccia Codice di errore rispetto a Ora.
Seleziona una cella con il codice di errore
protocol.http.DuplicateHeader, come mostrato di seguito:
Le informazioni sul codice di errore
protocol.http.DuplicateHeadervengono visualizzate come mostrato di seguito:
- Assicurati che il codice di stato sia
502, come mostrato nell'esempio sopra. - Fai clic su Visualizza log ed espandi la riga della richiesta non riuscita.
Nella finestra Log, prendi nota dei seguenti dettagli:
- Codice di stato:
502 - Origine errore:
target - Codice di errore:
protocol.http.DuplicateHeader.
- Codice di stato:
- L'origine dell'errore è
target, il che indica che la risposta del server di backend conteneva intestazioni duplicate.
Strumento Traccia
Per diagnosticare l'errore utilizzando lo strumento Traccia:
- Attiva la sessione di traccia e
- Attendi che si verifichi l'errore
502 Bad Gatewayo - Se riesci a riprodurre il problema, effettua la chiamata API e riproduci l'
502 Bad Gatewayerrore
- Attendi che si verifichi l'errore
Assicurati che l'opzione Mostra tutte le informazioni sul flusso sia attivata:

- Seleziona una delle richieste non riuscite ed esamina la traccia.
- Esamina le diverse fasi della traccia e individua il punto in cui si è verificato l'errore.
In genere, l'errore si verifica in un flusso dopo la fase Richiesta inviata al server di destinazione , come mostrato di seguito:

Prendi nota del valore dell'errore dalla traccia.
La traccia di esempio sopra mostra l'errore come
Duplicate Header "Expires". Poiché l'errore viene generato da Apigee dopo l'invio della richiesta al server di backend, indica che il server di backend ha inviato l'intestazioneExpirespiù di una volta.- Vai alla fase AX (Dati di analisi registrati) nella traccia e fai clic su di essa.
Scorri verso il basso fino alla sezione Dettagli fase - Intestazioni della risposta e determina i valori di X-Apigee-fault-code e X-Apigee-fault-source , come mostrato di seguito:

- Verranno visualizzati i valori di X-Apigee-fault-code e X-Apigee-fault-source come
protocol.http.DuplicateHeaderetarget, il che indica che questo errore è causato dal fatto che il server di backend ha passato intestazioni duplicate per l'intestazione della rispostaExpires.Intestazioni della risposta Valore X-Apigee-fault-code protocol.http.DuplicateHeaderX-Apigee-fault-source target Verifica se stai utilizzando l'incatenamento dei proxy; ovvero se il server di destinazione o l'endpoint di destinazione sta richiamando un altro proxy in Apigee.
Per determinarlo, torna alla fase Richiesta inviata al server di destinazione. Fai clic su Mostra curl.
Si apre la finestra Curl per la richiesta inviata al server di destinazione , da cui puoi determinare l'alias host del server di destinazione.
- Se l'alias host del server di destinazione rimanda a un alias host virtuale, si tratta di un incatenamento dei proxy
incatenamento. In questo caso, devi ripetere tutti i passaggi precedenti per il proxy concatenato finché
non determini la causa effettiva dell'errore
502 Bad Gateway. - Se l'alias host del server di destinazione rimanda al tuo server di backend, significa che il server di backend sta inviando le intestazioni duplicate nella risposta ad Apigee.
NGINX
Per diagnosticare l'errore utilizzando i log degli accessi NGINX:
- Se sei un utente di Private Cloud, puoi utilizzare i log degli accessi NGINX per
determinare le informazioni chiave sugli errori HTTP
502. Controlla i log degli accessi NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logDove: ORG, ENV e PORT# vengono sostituiti con valori effettivi.
- Cerca se sono presenti errori
502durante un periodo di tempo specifico (se il problema si è verificato in passato) o se sono presenti richieste che non vanno ancora a buon fine con502. Se trovi errori
502con il X-Apigee-fault-code corrispondente al valore diprotocol.http.DuplicateHeader, allora determina il valore di X-Apigee-fault-source.Esempio di errore 502 dal log degli accessi NGINX:
La voce di esempio sopra riportata dal log degli accessi NGINX ha i seguenti valori per X- Apigee-fault-code e X-Apigee-fault-source:
Intestazioni della risposta Valore X-Apigee-fault-code protocol.http.DuplicateHeaderX-Apigee-fault-source target
Causa: intestazione duplicata nella risposta
Diagnosi
- Determina il codice di errore e l'origine dell'errore per l'errore osservato utilizzando il monitoraggio delle API o i log degli accessi NGINX, come spiegato in Passaggi comuni per la diagnosi.
- Se l'origine dell'errore ha il valore
target, significa che la risposta inviata dal server di destinazione contiene intestazioni duplicate. Puoi determinare l'intestazione effettiva inviata più di una volta come parte della risposta utilizzando uno dei seguenti metodi:
Messaggio di errore
Utilizzo del messaggio di errore:
Se hai accesso al messaggio di errore completo ricevuto da Apigee Edge, consulta
faultstring. Ilfaultstringcontiene il nome dell'intestazione che è stata inviata più di una volta.Messaggio di errore di esempio:
"faultstring":"Duplicate Header \"Expires\""
- Nel messaggio di errore sopra, puoi vedere che l'intestazione
Expiresviene inviata più di una volta, come indicato infaultstring.
Richiesta effettiva
Utilizzo della richiesta effettiva:
- Se non hai accesso alla richiesta effettiva inviata al server di destinazione, recupera
il comando
curlcorrispondente dal passaggio 10.a e 10.b di Utilizzo dello strumento Traccia. Se hai accesso all'applicazione del server di destinazione, segui questi passaggi:
Effettua una chiamata al server di destinazione.
Richiesta di esempio per il server di destinazione utilizzato in questo esempio:
curl -X GET "https://BACKEND_SERVER_HOST/response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT" -v
Verifica l'elenco delle intestazioni visualizzate nella risposta.
Risposta di esempio dal server di destinazione utilizzato in questo esempio:
* ...Trimmed... > GET /response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT HTTP/2 > Host: BACKEND_SERVER_HOST > User-Agent: curl/7.64.1 > Accept: */* > * Connection state changed (MAX_CONCURRENT_STREAMS == 128)! < HTTP/2 200 < date: Fri, 02 Jul 2021 05:29:07 GMT < content-type: application/json < content-length: 166 < server: gunicorn/19.9.0 < Expires: Mon, 21 June 2021 07:28:00 GMT < Expires: Mon, 21 June 2021 07:28:00 GMT < access-control-allow-origin: * < access-control-allow-credentials: true < ----<Response BODY>------ * Connection #0 to host httpbin.org left intact * Closing connection 0
Nella richiesta di esempio sopra, l'intestazione
Expiresviene inviata più di una volta. Pertanto, questa richiesta non va a buon fine con l'errore502 Bad Gatewaye il codice di errore:protocol.http.DuplicateHeader.Se l'intestazione il cui nome viene visualizzato in
faultstringviene visualizzata più di una volta nella risposta del server di backend, questa è la causa di questo errore. Nel caso precedente, l'intestazioneExpiresviene inviata più di una volta.
Risoluzione
Correggere la duplicazione
Opzione 1 [opzione consigliata]: correggi il server di backend in modo che non includa intestazioni duplicate
- Analizza il motivo per cui il server di backend specifico invia l'intestazione duplicata
Expirese verifica se i proxy API possono accettarla. Nella maggior parte dei casi, non sarà auspicabile in base alla specifica HTTP RFC7230. - Se non è auspicabile, modifica l'applicazione del server di destinazione in modo che non invii intestazioni duplicate.
Nell'esempio discusso sopra, si nota che l'intestazione
Expiresviene inviata due volte con lo stesso valore, il che non è auspicabile. Puoi risolvere il problema assicurandoti che il server di destinazione passi l'intestazioneExpiresuna sola volta. - Se è auspicabile e vuoi consentire le intestazioni duplicate, vai all' opzione 2 Utilizzo della proprietà CwC.
CwC
Opzione 2: utilizzo della proprietà CwC
Apigee fornisce una proprietà CwC
HTTPHeader.<HeaderName> ,che consente alle applicazioni client e ai server di destinazione
di inviare intestazioni duplicate ai proxy API in Apigee Edge.
| Proprietà CwC | Valori |
|---|---|
HTTPHeader.<HeaderName> |
allowDuplicates,multivalued |
Ad esempio, la seguente proprietà può essere impostata sui processori di messaggi per consentire duplicati
e più valori per l'intestazione Expires.
HTTPHeader.Expires=allowDuplicates, multiValued
- Se sei un utente di cloud privato, puoi configurare la proprietà per impedire ad Apigee Edge di generare un errore
502 Bad Gateway, anche se la richiesta contiene intestazioni duplicate, utilizzando la guida illustrativa. - Se sei un utente di Public Cloud, contatta l'assistenza di Apigee Edge per configurare questa proprietà per la tua organizzazione.
Specifica
Apigee risponde con la risposta di errore 502 Bad Gateway perché si aspetta che il server di backend si comporti in base alle seguenti specifiche RFC:
| Specifica |
|---|
| RFC 7230, sezione 3.2.2: Field Order |
| RFC 7230, sezione 3.2: Header Fields |
Se hai ancora bisogno dell'assistenza di Apigee, vai a Raccogliere informazioni di diagnostica.
Raccogliere informazioni di diagnostica
Raccogli le seguenti informazioni di diagnostica, quindi contatta l'assistenza di Apigee Edge.
Se sei un utente di Public Cloud, fornisci le seguenti informazioni:
- Nome organizzazione
- Nome ambiente
- Nome proxy API
- Comando
curlcompleto utilizzato per riprodurre l'errore502 - File di traccia per le richieste API
Se sei un utente di Private Cloud, fornisci le seguenti informazioni:
- Messaggio di errore completo osservato per le richieste non riuscite
- Nome ambiente
- Bundle del proxy API
- File di traccia per le richieste API
Log degli accessi NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logDove: ORG, ENV e PORT# vengono sostituiti con i valori effettivi.
- Log di sistema del processore di messaggi
/opt/apigee/var/log/edge-message-processor/logs/system.log