400 Bad Request – DuplicateHeader

Sie lesen gerade die Dokumentation zu Apigee Edge.
Zur Dokumentation zu Apigee X.
info

Symptom

Die Clientanwendung erhält den HTTP-Statuscode 400 Bad Request mit dem Fehlercode protocol.http.DuplicateHeader als Antwort auf API-Aufrufe.

Fehlermeldung

Die Clientanwendung erhält den folgenden Antwortcode:

HTTP/1.1 400 Bad Request

Außerdem wird möglicherweise eine Fehlermeldung ähnlich der folgenden angezeigt:

{
   "fault":{
      "faultstring":"Duplicate Header \"Expires\"",
      "detail":{
         "errorcode":"protocol.http.DuplicateHeader"
      }
   }
}

Mögliche Ursachen

Dieser Fehler tritt auf, wenn ein bestimmter HTTP-Header, der keine Duplikate in Apigee Edge haben darf, mehrmals mit denselben oder unterschiedlichen Werten als Teil der HTTP-Anfrage auftritt, die vom Client an Apigee Edge gesendet wird.

Gemäß RFC 7230, Abschnitt 3.2.2: Feldreihenfolge, darf ein Absender in einer Nachricht nicht mehrere Headerfelder mit demselben Feldnamen generieren, es sei denn, der gesamte Feldwert für dieses Headerfeld ist als durch Kommas getrennte Liste definiert ( #(values)) oder das Headerfeld ist eine bekannte Ausnahme. Wenn Apigee Edge einen bestimmten Header, der keine Duplikate haben darf, mehr als einmal in der HTTP-Anfrage findet, die vom Client gesendet wird, antwortet es mit 400 Bad Request und dem Fehlercode protocol.http.DuplicateHeader.

Mögliche Ursachen für diesen Fehler:

Ursache Beschreibung Anleitungen zur Fehlerbehebung gelten für
Doppelter Header in der Anfrage Die HTTP-Anfrage von der Clientanwendung an Apigee enthält doppelte Header. Nutzer von Edge Public und Private Cloud

Allgemeine Diagnoseschritte

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

API-Monitoring

So diagnostizieren Sie den Fehler mit API-Monitoring:

  1. Melden Sie sich in der Apigee Edge-Benutzeroberfläche als Nutzer mit einer entsprechenden 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. Achten Sie darauf, dass der Proxy-Filter auf Alle festgelegt ist.
  6. Stellen Sie Fehlercode im Verhältnis zu Zeit dar.
  7. Wählen Sie eine Zelle mit dem Fehlercode protocol.http.DuplicateHeader aus, wie unten gezeigt:

  8. Informationen zum Fehlercode protocol.http.DuplicateHeader werden angezeigt wie unten gezeigt:

  9. Klicken Sie auf Logs ansehen und maximieren Sie die Zeile für die fehlgeschlagene Anfrage.
  10. Notieren Sie sich im Fenster Logs die folgenden Details:
    1. Statuscode:400
    2. Fehlerquelle:apigee
    3. Fehlercode:protocol.http.DuplicateHeader.
  11. Wenn die Fehlerquelle den Wert apigee oder MP hat und der Fehlercode den Wert protocol.http.DuplicateHeader, enthält die HTTP-Anfrage vom Client doppelte Header.

Trace-Tool

NGINX

So diagnostizieren Sie den Fehler mit NGINX-Zugriffslogs:

  1. Wenn Sie Private Cloud-Nutzer sind, können Sie NGINX-Zugriffslogs verwenden, um die wichtigsten Informationen zu HTTP-400 Fehlern zu ermitteln.
  2. Prüfen Sie die NGINX-Zugriffslogs:

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

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

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

    Beispiel für einen 400-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:

    Antwortheader Wert
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source MP

Ursache: Doppelter Header in der Anfrage

Diagnose

  1. Ermitteln Sie den Fehlercode und die Fehlerquelle für den beobachteten Fehler mithilfe von API Monitoring oder NGINX-Zugriffslogs, wie unter Allgemeine Diagnoseschritte beschrieben.
  2. Wenn die Fehlerquelle den Wert apigee oder MP hat, bedeutet dies, dass die von der Clientanwendung an Apigee gesendete Anfrage doppelte Header enthält.
  3. Sie können den tatsächlichen Header, der mehrmals als Teil der Anfrage gesendet wird, mit einer der folgenden Methoden ermitteln:

    Fehlermeldung

    Fehlermeldung verwenden

    1. Wenn Sie Zugriff auf die vollständige Fehlermeldung haben, die Sie von Apigee Edge erhalten haben, dann sehen Sie sich den faultstring an. Der faultstring enthält den Headernamen, der mehrmals gesendet wurde.

      Beispiel für eine Fehlermeldung:

      "faultstring":"Duplicate Header \"Expires\""
    2. In der obigen Fehlermeldung sehen Sie, dass der Header Expires mehrmals gesendet wurde, wie im faultstring zu sehen ist.

    Tatsächliche Anfrage

    Tatsächliche Anfrage verwenden

    1. Wenn Sie Zugriff auf die tatsächliche Anfrage der Clientanwendung haben, führen Sie die folgenden Schritte aus:

      1. Prüfen Sie die Liste der in der Anfrage übergebenen Header.
      2. Wenn ein bestimmter Header mehrmals mit demselben oder unterschiedlichen Werten in der Anfrage vorkommt , ist das die Ursache für diesen Fehler.

      Beispielanfrage:

      curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT" -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
      

      In der obigen Beispielanfrage wird der Header Expires mehrmals gesendet. Daher schlägt diese Anfrage mit dem 400 Bad Request Fehler und dem Fehlercode: protocol.http.DuplicateHeader fehl.

    2. Alternativ können Sie in den Clientlogs nach Informationen zur tatsächlichen Anfrage an Apigee Edge suchen und den Header ermitteln, der mehrmals gesendet wird.

Auflösung

Duplikate beheben

Option 1 [empfohlen]: Clientanwendung so korrigieren, dass keine doppelten Header enthalten sind

  1. Analysieren Sie den Grund dafür, dass der bestimmte Client einen doppelten Header sendet. Im obigen Fall ist das beispielsweise Expires Prüfen Sie, ob die API-Proxys den doppelten Header akzeptieren können. Gemäß der HTTP-Spezifikation RFC7230 ist das in der Regel nicht erwünscht.
  2. Wenn das nicht erwünscht ist, ändern Sie Ihre Clientanwendung so, dass keine doppelten Header gesendet werden.

    Im oben beschriebenen Beispiel wird der Header Expires zweimal mit demselben Wert gesendet, was nicht erwünscht ist. Sie können das Problem beheben, indem Sie den Expires Header nur einmal übergeben, wie unten gezeigt:

    curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
    
  3. Wenn das erwünscht ist und Sie die doppelten Header zulassen möchten, fahren Sie mit Option 2: CwC-Attribut verwenden fort.

CwC

Option 2: CwC-Attribut verwenden

Apigee provides a CwC property HTTPHeader.<HeaderName> ,mit dem Client anwendungen und Zielserver doppelte Header an API-Proxys in Apigee Edge senden können.

CwC-Attribut Werte
HTTPHeader.<HeaderName> allowDuplicates,multivalued

Das folgende Attribut kann beispielsweise für die Message Processor festgelegt werden, um Duplikate und mehrere Werte für den Header Expires zuzulassen.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. Wenn Sie Private Cloud-Nutzer sind, können Sie das Attribut so konfigurieren, dass Apigee Edge keinen 400 Bad Request Fehler auslöst, auch wenn die Anfrage doppelte Header enthält. Eine Anleitung dazu finden Sie unter Message Processor für die Verwendung doppelter Header konfigurieren.
  2. Wenn Sie Public Cloud-Nutzer sind, wenden Sie sich an den Apigee Edge-Support, um dieses Attribut für Ihre Organisation zu konfigurieren.

Spezifikation

Apigee erwartet, dass die Clientanwendung gemäß den folgenden RFC-Spezifikationen keine doppelten Header als Teil der Anfrage sendet:

Spezifikation
RFC 7230, Abschnitt 3.2.2: Feldreihenfolge
RFC 7230, Abschnitt 3.2: Headerfelder

Wenn Sie weiterhin Unterstützung vom Apigee-Support benötigen, lesen Sie den Abschnitt Erfassen von Diagnoseinformationen erforderlich.

Erfassen von Diagnoseinformationen erforderlich

Erfassen Sie die folgenden Diagnoseinformationen und wenden Sie sich dann an den Apigee Edge-Support.

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

  • Name der Organisation
  • Name der Umgebung
  • Name des API-Proxys
  • Vollständiger curl-Befehl zum Reproduzieren des 400-Fehlers
  • Trace-Datei für die API-Anfragen

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

  • Vollständige Fehlermeldung für die fehlgeschlagenen Anfragen
  • Name der Umgebung
  • API-Proxy-Bundle
  • Vollständiger curl-Befehl zum Reproduzieren des 400-Fehlers
  • Trace-Datei für die API-Anfragen
  • NGINX-Zugriffslogs:

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

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

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