Message Processor so konfigurieren, dass doppelte Header zugelassen werden

Sie lesen gerade die Dokumentation zu Apigee Edge.
Apigee X-Dokumentation aufrufen
info

Gemäß der HTTP-Spezifikation RFC 7230, Abschnitt 3.2.2: Feldreihenfolge erwartet Apigee Edge, dass die HTTP-Anfrage des Clients oder die HTTP-Antwort des Backend-Servers nicht denselben Header mehr als einmal mit denselben oder unterschiedlichen Werten enthält, es sei denn, für den jeweiligen Header gilt eine Ausnahme und Duplikate sind zulässig.

Standardmäßig lässt Apigee Edge Duplikate und mehrere Werte für die meisten HTTP-Header zu. Bestimmte Header, die in Headern, die keine Duplikate und mehrere Werte enthalten dürfen aufgeführt sind, sind jedoch nicht zulässig. Beispiele:

  • Sie erhalten 400 Bad Request mit dem Fehlercode protocol.http.DuplicateHeader, wenn der Client eine HTTP-Anfrage mit einem bestimmten Header mehrmals oder mit mehreren Werten für die HTTP-Header sendet, die in Apigee Edge keine Duplikate/mehrere Werte haben dürfen.
  • Ebenso erhalten Sie 502 Bad Gateway mit dem Fehlercode protocol.http.DuplicateHeader, wenn der Backend-Server eine HTTP-Antwort mit einem bestimmten Header mehrmals oder mit mehreren Werten für die HTTP-Header sendet, die in Apigee Edge keine Duplikate oder mehrere Werte haben dürfen.

Die empfohlene Lösung für diese Fehler besteht darin, die Clientanwendung und den Backend-Server so zu korrigieren, dass keine doppelten Header gesendet werden und die Spezifikation RFC 7230, Abschnitt 3.2.2: Feldreihenfolge eingehalten wird. Weitere Informationen finden Sie in den folgenden Playbooks zur Fehlerbehebung:

In einigen Fällen kann es jedoch sinnvoll sein, eine Ausnahme hinzuzufügen, um Duplikate und mehrere Werte für bestimmte HTTP-Header einzuschließen. In solchen Fällen können Sie doppelte Header und mehrere Werte für einen bestimmten HTTP-Header zulassen, indem Sie auf Message Processor-Ebene die Eigenschaft HTTPHeader.HEADER_NAME festlegen.

In diesem Dokument finden Sie Informationen zu dieser Property. Außerdem wird erläutert, wie Sie sie aktivieren, um die oben genannten Fehler zu vermeiden, und es werden Best Practices dazu vorgestellt.

HTTP-Header-Attribute, die Duplikate und mehrere Werte zulassen

Apigee Edge bietet die folgenden zwei Eigenschaften, um das Verhalten beim Zulassen von Duplikaten und mehreren Werten für HTTP-Header zu steuern. Diese können nur auf den Message Processors mit der in Edge konfigurieren beschriebenen Tokensyntax konfiguriert werden.

Property-Name Beschreibung Zulässige Werte
HTTPHeader.ANY

Diese Eigenschaft gibt an, ob Duplikate oder mehrere Werte für alle HTTP-Header zulässig sind, einschließlich der benutzerdefinierten Header, die als Teil der HTTP-Anfrage des Clients oder der HTTP-Antwort des Backend-Servers an Apigee Edge gesendet werden.

Standardwert:

multiValued, allowDuplicates,

  1. blank: Doppelte und mehrere Werte für HTTP-Header sind nicht zulässig.
  2. multiValued: Teilen Sie den mehrwertigen Header in mehrere Header auf. Für HTTP-Header sind mehrere Werte zulässig, aber keine Duplikate. Der Wert multiValued ist aktiviert, was bedeutet, dass test-header=a,b in test-header=a und test-header=b. konvertiert wird.
  3. allowDuplicates: Ermöglicht mehrere (doppelte) HTTP-Header mit demselben Namen.
  4. multiValued, allowDuplicates: Für HTTP-Header sind sowohl mehrere Werte als auch Duplikate zulässig.

HTTPHeader.HEADER_NAME

Mit diesem Attribut wird das Verhalten eines bestimmten Headers überschrieben, das durch HTTPHeader.ANY angegeben wird.

Wie oben.

Header, die keine Duplikate und mehrere Werte enthalten dürfen

Wie bereits erwähnt, sind in Apigee Edge standardmäßig Duplikate und mehrere Werte für die meisten HTTP-Header zulässig. Das liegt daran, dass das Attribut HTTPHeader.ANY mit dem Wert multiValued, allowDuplicates. konfiguriert ist.

Konfiguration überschrieben

Bei einigen bestimmten Headern wird die Standardkonfiguration mit einer der folgenden Methoden überschrieben:

  • HTTPHeader.HEADER_NAME=multiValued, allowDuplicates

    Diese Konfiguration ändert das Standardverhalten nicht. Das bedeutet, dass der jeweilige Header Duplikate und mehrere Werte enthalten darf.

    .
  • HTTPHeader.HEADER_NAME=

    Diese Konfiguration ändert das Standardverhalten. Das bedeutet, dass der jeweilige Header keine Duplikate und mehrere Werte enthalten darf.

Header ermitteln, die keine Duplikate und mehrere Werte enthalten dürfen

In diesem Abschnitt wird beschrieben, wie Sie Folgendes ermitteln:

  • Die spezifischen Header, die keine Duplikate und mehrere Werte in Ihrer Apigee Edge Private Cloud-Einrichtung haben dürfen, und
  • Die spezifischen Header mit vorhandener Konfiguration
  1. Suchen Sie auf dem Message Processor-Computer im Verzeichnis /opt/apigee/edge-message-processor/conf nach der Eigenschaft HTTPHeader., wie unten dargestellt:

    grep -ri "HTTPHeader." /opt/apigee/edge-message-processor/conf
    

    Beispielausgabe:

    # grep -ri "HTTPHeader" /opt/apigee/edge-message-processor/conf
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.ANY=allowDuplicates, multiValued
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Connection=allowDuplicates, multiValued
    … <snipped>
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Host=
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Date=allowDuplicates
    …
    <snipped>
  2. Wie im Abschnitt Konfiguration überschrieben erläutert, sind in der obigen Beispielausgabe folgende Informationen zu beachten:
    1. Der HTTP-Header Connection wird überschrieben, darf aber Duplikate und mehrere Werte enthalten.
    2. Die HTTP-Header Host und Expires werden überschrieben und dürfen keine Duplikate und mehrere Werte enthalten.
    3. Der HTTP-Header Date wird überschrieben und darf Duplikate enthalten, aber nicht mehrere Werte.
    4. Alle Header, die hier angezeigt werden (Connection, Host, Expires und Date im obigen Beispiel), werden in diesem Dokument als Header mit vorhandener Konfiguration bezeichnet.

Verhalten von Apigee Edge

In der folgenden Tabelle wird das Verhalten von Apigee Edge beschrieben, wenn die Header als Duplikate und mit mehreren Werten gesendet werden. Dies hängt davon ab, wie die HTTPHeader-Attribute auf den Message Processors mit einem Beispiel-HTTPHeader von test-header konfiguriert sind.

Anfrage Ausgehende HEADERS basierend auf dem Wert von conf/http.properties+HTTPHeader.test-header=
<Leer> allowDuplicates multiValued allowDuplicates, multiValued (STANDARD)
test‑header=a,b test‑header=a,b test‑header=a,b

protocol.http.
DuplicateHeader

Intern unterteilen wir test-header=a,b in:

  • test-header=a
  • test-header=b,

und dann der Fehler DuplicateHeader ausgegeben wird.

test‑header=a,b

Intern unterteilen wir test-header=a,b in:

  • test-header=a
  • test-header=b,

Das ursprüngliche Formular wird dann an das Ziel gesendet.

test‑header=a
test‑header=b
protocol.http.
DuplicateHeader
test‑header=a
test‑header=b
protocol.http.
DuplicateHeader
test‑header=a
test‑header=b

Hinweis

Bevor Sie die Schritte in diesem Dokument ausführen, sollten Sie sich mit der Konfiguration von Eigenschaften für Edge for Private Cloud vertraut machen, wie unter Edge konfigurieren beschrieben.

allowDuplicates und mehrere Werte für Header konfigurieren

Wie unter HTTP-Header-Properties zum Zulassen von Duplikaten und mehreren Werten beschrieben, bedeutet der Wert der Property HTTPHeader.ANY = allowDuplicates, multiValued, dass für alle Header Duplikate und mehrere Werte in Apigee Edge zulässig sind. Es gibt jedoch bestimmte Header, deren Werte explizit überschrieben werden, um doppelte Header oder mehrere Werte für diese mithilfe der Eigenschaft HTTPHeader.HEADER_NAME zu verhindern.

In diesem Abschnitt wird beschrieben, wie Sie die Eigenschaft HTTPHeader.HEADER_NAME konfigurieren, um Duplikate und mehrere Werte für alle entsprechenden HTTP-Header in den Message Processors zuzulassen. Verwenden Sie dazu das entsprechende Token gemäß der in Edge konfigurieren beschriebenen Syntax.

In diesem Abschnitt verwenden wir Expires (und myheader) als Beispielheader, für den wir Duplikate und mehrere Werte zulassen möchten, wie unten beschrieben:

  1. Aktuellen Wert der Property HTTPHeaderHEADER_NAME ermitteln, um sicherzugehen, dass sie nicht bereits aktiviert ist, damit Duplikate und mehrere Werte mit dem folgenden Befehl zugelassen werden:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Wenn Sie beispielsweise die Eigenschaft für den Expires-Header festlegen möchten, prüfen Sie den aktuellen Wert des Tokens HTTPHeader.Expires für die Eigenschaft im Nachrichtenprozessor:

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    

    Die Ausgabe des obigen Befehls ist eine der folgenden:

    1. Wenn die Eigenschaft leer ist, bedeutet das, dass der Wert überschrieben wird (und dies ist ein Header mit vorhandener Konfiguration), um keine doppelten Header und mehrere Werte zuzulassen. Das bedeutet, dass Sie den Expires-Header nicht mehr als einmal als Teil der HTTP-Anfrage oder HTTP-Antwort an Apigee senden dürfen.
    2. Wenn es keine Treffer für das Attribut gibt, wird der Wert nicht überschrieben (und es handelt sich NICHT um einen Header mit vorhandener Konfiguration). Das bedeutet, dass der jeweilige Header mehrmals (Duplikate sind zulässig) als Teil der HTTP-Anfrage oder HTTP-Antwort an Apigee Edge gesendet werden kann.
    3. Wenn die Property mit dem Wert allowDuplicates, multiValued festgelegt wird, bedeutet das, dass der Wert explizit überschrieben wird(und dies ist ein Header mit vorhandener Konfiguration). Das bedeutet, dass der jeweilige Header mehr als einmal (Duplikate sind zulässig) als Teil der HTTP-Anfrage oder HTTP-Antwort an Apigee gesendet werden kann.

    Beispielausgabe des Suchbefehls:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=

    Die obige Beispielausgabe zeigt, dass die Eigenschaft HTTPHeader.Expires auf leer gesetzt ist. Das bedeutet, dass die Property überschrieben wird, um keine doppelten oder mehrere Werte für den Header Expires zuzulassen.

  2. Wenn Sie feststellen, dass die Eigenschaft, die dem jeweiligen Header entspricht, explizit überschrieben wird, um keine doppelten oder mehrere Werte zuzulassen, wie in der Beispielausgabe oben, führen Sie nur dann die folgenden Schritte aus. Wenn sie nicht explizit überschrieben wird, überspringen Sie die restlichen Schritte in diesem Abschnitt.
  3. die etwas Wenn sie nicht vorhanden ist, können Sie sie erstellen:
    /opt/apigee/customer/application/message-processor.properties

    Wenn Sie die Datei beispielsweise mit vi öffnen möchten, geben Sie Folgendes ein:

    vi /opt/apigee/customer/application/message-processor.properties
    
  4. Fügen Sie eine Zeile im folgenden Format hinzu:
    conf_http_HTTPHeader.Expires=allowDuplicates, multiValued
  5. Speichern Sie die Änderungen.
  6. Prüfen Sie, ob die Eigenschaftendatei dem Nutzer apigee gehört. Wenn nicht, führen Sie den folgenden Befehl aus:

    chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
    
  7. Starten Sie den Message Processor neu:

    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
    

    Informationen zum Neustarten ohne Auswirkungen auf den Traffic finden Sie unter Rolling Restart von Message Processors ohne Auswirkungen auf den Traffic.

  8. Wenn Sie mehr als einen Message Processor haben, wiederholen Sie die oben genannten Schritte für alle Message Processors.

Prüfen, ob der Header für Duplikate und mehrere Werte konfiguriert ist

In diesem Abschnitt wird erläutert, wie Sie prüfen können, ob das Attribut HTTPHeader.HEADER_NAME für einen bestimmten Header erfolgreich aktualisiert wurde, um Duplikate in den Message Processors zuzulassen.

Wir verwenden Expires als Beispielheader und prüfen, ob die entsprechende Property HTTPHeader.Expires aktualisiert wurde.

Auch wenn Sie das Token conf_http_HTTPHeader.Expires verwenden, um den Wert im Message Processor zu aktualisieren, müssen Sie prüfen, ob die tatsächliche Property HTTPHeader.Expires mit dem neuen Wert festgelegt wurde.

  1. Suchen Sie auf dem Message Processor-Computer im Verzeichnis /opt/apigee/edge-message-processor/conf nach dem Attribut HTTPHeader.HEADER_NAME und prüfen Sie, ob es mit dem neuen Wert festgelegt wurde, wie unten dargestellt:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Wenn Sie beispielsweise prüfen möchten, ob das Attribut HTTPHeader.Expires mit dem neuen Wert festgelegt wurde, führen Sie den folgenden Befehl aus:

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    
  2. Wenn der neue Wert für HTTPHeader.HEADER_NAME im Message Processor erfolgreich festgelegt wurde, wird der neue Wert im oben genannten Befehl in der Datei http.properties angezeigt.
  3. Das Beispielergebnis des obigen Befehls nach der Konfiguration von allowDuplicates und multiValued sieht so aus:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
  4. In der obigen Beispielausgabe wurde die Eigenschaft HTTPHeader.Expires mit dem neuen Wert allowDuplicates, multiValued in http.properties festgelegt. Das bedeutet, dass das Verhalten, Duplikate und mehrere Werte in HTTPHeader zuzulassen, im Message Processor erfolgreich konfiguriert wurde.
  5. Wenn Sie immer noch den alten Wert für das Attribut HTTPHeader.HEADER_NAME sehen, prüfen Sie, ob Sie alle Schritte unter allowDuplicates und mehrere Werte für Header konfigurieren korrekt ausgeführt haben. Wenn Sie einen Schritt ausgelassen haben, wiederholen Sie alle Schritte noch einmal.

    Prüfen Sie, ob Ihre Proxys wie erwartet funktionieren, insbesondere wenn es eine funktionale Logik zum Abrufen und Festlegen der Header im Proxy gibt.

  6. Wenn Sie das Attribut immer noch nicht ändern können, wenden Sie sich an den Apigee Edge-Support.

allowDuplicates für Header deaktivieren

In diesem Abschnitt wird beschrieben, wie Sie die Eigenschaft HTTPHeader.{Headername} so konfigurieren, dass keine Duplikate und mehrere Werte für einen bestimmten HTTP-Header auf den Message Processors zulässig sind. Dazu verwenden Sie das entsprechende Token gemäß der in Edge konfigurieren beschriebenen Syntax.

In diesem Abschnitt verwenden wir Expires (und myheader) als Beispielheader, für den wir keine Duplikate zulassen möchten, wie unten erläutert:

  1. Aktuellen Wert ermitteln des Attributs HTTPHeaderHEADER_NAME, um sicherzustellen, dass es nicht bereits deaktiviert ist, damit Duplikate und mehrere Werte mit dem folgenden Befehl zugelassen werden:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Wenn Sie beispielsweise die Eigenschaft für den Expires-Header festlegen möchten, prüfen Sie den aktuellen Wert des Tokens HTTPHeader.Expires für die Eigenschaft im Nachrichtenprozessor:

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    

    Die Ausgabe des obigen Befehls ist eine der folgenden:

    1. Wenn die Property auf „blank“ gesetzt ist, wird der Wert iauf „NOT“ überschrieben, um doppelte Header und mehrere Werte zuzulassen. Das bedeutet, dass Sie den Expires-Header nicht mehr als einmal als Teil der HTTP-Anfrage oder HTTP-Antwort an Apigee senden dürfen.
    2. Wenn es keine Treffer für das Attribut gibt, bedeutet das, dass der Wert nicht überschrieben wird. In diesem Fall handelt es sich um einen NOT-Header mit vorhandener Konfiguration. Das bedeutet, dass der jeweilige Header mehrmals (Duplikate sind zulässig) als Teil der HTTP-Anfrage oder HTTP-Antwort an Apigee Edge gesendet werden kann.
    3. Wenn die Property mit dem Wert allowDuplicates, multiValued festgelegt wird, bedeutet das, dass der Wert explizit überschrieben wird und es sich um eine vorhandene Konfiguration handelt. Das bedeutet jedoch, dass der jeweilige Header mehrmals (Duplikate sind zulässig) als Teil der HTTP-Anfrage oder HTTP-Antwort an Apigee gesendet werden kann.

    Beispielausgabe 1

    Beispielausgabe 1 des Suchbefehls:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued

    Die Beispielausgabe zeigt, dass das Attribut HTTPHeader.Expires auf allowDuplicates, multiValued gesetzt ist. Das bedeutet, dass die Property überschrieben wird, um doppelte oder mehrere Werte für den Header Expires zuzulassen.

    Beispielausgabe 2

    Beispielbefehl und -ausgabe 2 des Suchbefehls

    grep -ri "HTTPHeader.myheader" /opt/apigee/edge-message-processor/conf
    

    Die Beispielausgabe zeigt keine Ausgabe, was bedeutet, dass das Attribut HTTPHeader.myheader standardmäßig auf allowDuplicates, multiValued gesetzt ist. Das bedeutet auch, dass die Eigenschaft nicht überschrieben wird für den Header „myheader“.

  2. Wenn Sie eines der folgenden Probleme feststellen, führen Sie die restlichen Schritte in diesem Abschnitt aus:
    1. Die Eigenschaft, die dem jeweiligen Header entspricht, wird überschrieben, um Duplikate und mehrere Werte zuzulassen, wie in Beispielausgabe 1 oben (Header mit vorhandener Konfiguration)
    2. Es gibt keine Treffer für die Property, die dem spezifischen Header entspricht, wie im Beispiel für die Ausgabe 2 oben (kein Header mit bereits vorhandener Konfiguration).

    Überspringen Sie andernfalls die restlichen Schritte in diesem Abschnitt.

  3. Bearbeiten Sie die folgende Datei. Wenn es nicht vorhanden ist, können Sie es erstellen.
    /opt/apigee/customer/application/message-processor.properties

    Wenn Sie die Datei beispielsweise mit vi öffnen möchten, geben Sie Folgendes ein:

    vi /opt/apigee/customer/application/message-processor.properties
    
  4. Fügen Sie der Datei mit den Eigenschaften eine Zeile im folgenden Format hinzu:

    Vorhandene Konfiguration

    Szenario 1: Header mit vorhandener Konfiguration

    conf_http_HTTPHeader.Expires=

    Keine vorhandene Konfiguration

    Szenario 2: Kein Header mit vorhandener Konfiguration:

    conf/http.properties+HTTPHeader.myheader=
  5. Speichern Sie die Änderungen.
  6. Prüfen Sie, ob die Eigenschaftendatei dem Nutzer apigee gehört. Falls nicht, führen Sie Folgendes aus:
    chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
    
  7. Starten Sie den Message Processor neu:
    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
    

    Informationen zum Neustarten ohne Auswirkungen auf den Traffic finden Sie unter Rolling Restart von Message Processors ohne Auswirkungen auf den Traffic.

  8. Wenn Sie mehr als einen Message Processor haben, wiederholen Sie die obigen Schritte für alle Message Processors.

Prüfen, ob der Header so konfiguriert ist, dass keine Duplikate und mehrere Werte zulässig sind

In diesem Abschnitt wird beschrieben, wie Sie überprüfen, ob die Property HTTPHeader.HEADER_NAME für einen bestimmten Header erfolgreich aktualisiert wurde, sodass keine Duplikate in den Message Processors zugelassen werden.

Wir verwenden Expires (und myheader) als Beispielheader und prüfen, ob die entsprechende Property HTTPHeader.Expires (und HTTPHeader.myheader) aktualisiert wurde.

  1. Suchen Sie auf dem Message Processor-Computer im Verzeichnis /opt/apigee/edge-message- processor/conf nach dem Attribut HTTPHeader.HEADER_NAME und prüfen Sie, ob es mit dem neuen Wert festgelegt wurde, wie unten dargestellt:

    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Wenn Sie beispielsweise prüfen möchten, ob das Attribut HTTPHeader.Expires mit dem neuen Wert festgelegt wurde, können Sie den folgenden Befehl ausführen:

    Vorhandene Konfiguration

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    

    Keine vorhandene Konfiguration

    grep -ri "HTTPHeader.myheader" /opt/apigee/edge-message-processor/conf
    
  2. Wenn der neue HTTP-Headerwert für HTTPHeader.HEADER_NAME I im Message Processor erfolgreich festgelegt wurde, wird der neue Wert im oben genannten Befehl in der Datei http.properties angezeigt.
  3. Das Beispielergebnis des obigen Befehls nach dem Deaktivieren von allowDuplicates sieht so aus:

    Vorhandene Konfiguration

    Szenario 1: Expires-Header (Header mit vorhandener Konfiguration)

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=

    Keine vorhandene Konfiguration

    Szenario 2: „myheader“-Header (kein Header mit vorhandener Konfiguration)

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.myheader=
  4. In der obigen Beispielausgabe wurde die Eigenschaft HTTPHeader.Expires ( und HTTPHeader.myheader) mit dem neuen Wert {blank} in http.properties} festgelegt. Das bedeutet, dass das Verhalten, das Duplikate und mehrere Werte für den spezifischen HTTP-Header Expires (und myheader) zulässt, im Message Processor erfolgreich deaktiviert wurde.
  5. Wenn Sie immer noch den alten Wert für das Attribut HTTPHeader.Expires (or HTTPHeader.myheader) sehen, prüfen Sie, ob Sie alle Schritte unter allowDuplicates und mehrere Werte für Header konfigurieren korrekt ausgeführt haben. Wenn Sie einen Schritt ausgelassen haben, wiederholen Sie alle Schritte noch einmal.

    Prüfen Sie, ob Ihre Proxys wie erwartet funktionieren, insbesondere wenn es eine funktionale Logik zum Abrufen und Festlegen der Header im Proxy gibt.

  6. Wenn Sie die Property weiterhin nicht ändern können, wenden Sie sich an den Apigee Edge-Support.