Message Processor so konfigurieren, dass doppelte Header zugelassen werden

Sie sehen sich die Dokumentation zu Apigee Edge an.
Sehen Sie sich die Apigee X-Dokumentation an.
info

Gemäß der HTTP-Spezifikation RFC 7230, Abschnitt 3.2.2: Feldreihenfolge erwartet Apigee Edge, dass die HTTP-Anfrage vom Client oder die HTTP-Antwort vom Backend-Server nicht denselben Header mehrmals mit denselben oder unterschiedlichen Werten enthalten, es sei denn, für den jeweiligen Header gilt eine Ausnahme und es sind Duplikate zulässig.

Standardmäßig erlaubt Apigee Edge, dass Duplikate und mehrere Werte an die meisten HTTP-Header übergeben werden. Bestimmte Header, die unter Header, 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 enthalten 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 konfigurieren, 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 einige HTTP-Header zuzulassen. In solchen Fällen können Sie doppelte Header und mehrere Werte für einen bestimmten HTTP-Header zulassen, indem Sie auf Ebene des Nachrichten-Prozessors eine Eigenschaft HTTPHeader.HEADER_NAME festlegen.

In diesem Dokument wird erläutert, wie Sie diese Property aktivieren, um die oben genannten Fehler zu vermeiden, und es werden Best Practices vorgestellt.

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

Apigee Edge bietet die folgenden beiden Eigenschaften, um das Verhalten zu steuern, mit dem Duplikate und mehrere Werte für HTTP-Header zulässig sind. Hinweis: Diese können nur auf den Message Processors mithilfe der Tokensyntax konfiguriert werden, die im Hilfeartikel Edge konfigurieren erläutert wird.

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 im Rahmen der HTTP-Anfrage des Clients oder der HTTP-Antwort gesendet werden, die vom Backend-Server an Apigee Edge gesendet wird.

Standardwert:

multiValued, allowDuplicates,

  1. blank: Duplikate und mehrere Werte für HTTP-Header sind nicht zulässig.
  2. multiValued: Teilt 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 impliziert, dass test-header=a,b in test-header=a und test-header=b. konvertiert wird.
  3. allowDuplicates: Ermöglicht mehrere (duplizierte) HTTP-Header mit demselben Namen.
  4. multiValued, allowDuplicates: Sowohl mehrere Werte als auch Duplikate sind für HTTP-Header zulässig.

HTTPHeader.HEADER_NAME

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

Wie oben.

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

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

Konfiguration überschrieben

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

  • HTTPHeader.HEADER_NAME=multiValued, allowDuplicates

    Durch diese Konfiguration wird das Standardverhalten nicht geändert. Das bedeutet, dass für den jeweiligen Header Duplikate und mehrere Werte zulässig sind.

    .
  • HTTPHeader.HEADER_NAME=

    Durch diese Konfiguration wird das Standardverhalten geändert. Das heißt, der spezifische Header dürfen keine Duplikate und mehrere Werte enthalten.

Header bestimmen, die keine Duplikate und mehrere Werte haben dürfen

In diesem Abschnitt wird beschrieben, wie Sie Folgendes erkennen:

  • Die spezifischen Header, die in Ihrer Apigee Edge Private Cloud-Umgebung keine Duplikate und mehrere Werte haben dürfen , und
  • Die spezifischen Header mit einer bereits vorhandenen Konfiguration
  1. Suche auf dem Message Processor-Rechner im Verzeichnis /opt/apigee/edge-message-processor/conf nach der Property 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 Beispielausgabe oben 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 hier aufgeführten Header (Connection, Host, Expires und Date im Beispiel oben) werden in diesem Dokument als Header mit bereits 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, je nachdem, wie die HTTPHeader-Attribute in den Message Processors konfiguriert werden. Als Beispiel wird für HTTPHeader der Wert test-header verwendet.

Anfrage Ausgehende HEADER basierend auf dem Wert von conf/http.properties+HTTPHeader.test-header=
<Leer> allowDuplicates multiValued allowDuplicates, multiValued (DEFAULT)
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 und
  • test-header=b

und dann wird der Fehler DuplicateHeader ausgegeben.

test‑header=a,b

test-header=a,b wurde intern aufgeteilt in:

  • test-header=a und
  • 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 Properties für Edge in der Private Cloud vertraut machen. Weitere Informationen finden Sie unter Edge konfigurieren.

„allowDuplicates“ und mehrere Werte für Überschriften konfigurieren

Wie unter HTTP-Header-Properties, die Duplikate und mehrere Werte zulassen erläutert, bedeutet der Wert der Property HTTPHeader.ANY = allowDuplicates, multiValued, dass alle Header in Apigee Edge Duplikate und mehrere Werte haben dürfen. Es gibt jedoch bestimmte Überschriften, deren Werte explizit überschrieben werden, um doppelte Überschriften oder mehrere Werte für „Dieses Jahr“ mithilfe der Property HTTPHeader.HEADER_NAME zu verhindern.

In diesem Abschnitt wird beschrieben, wie Sie die Property HTTPHeader.HEADER_NAME so konfigurieren, dass Duplikate und mehrere Werte für alle entsprechenden HTTP-Header in den Nachrichten-Prozessoren zulässig sind. Verwenden Sie dazu das entsprechende Token gemäß der Syntax, die im Hilfeartikel Edge konfigurieren beschrieben wird.

In diesem Abschnitt verwenden wir Expires (und myheader) als Beispiel für einen Header, für den wir Duplikate und mehrere Werte zulassen möchten, wie unten erläutert:

  1. Aktuellen Wert der Property HTTPHeaderHEADER_NAME ermitteln, um sicherzustellen, dass Duplikate und mehrere Werte nicht bereits zulässig sind. Verwenden Sie dazu den folgenden Befehl:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

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

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

    Die Ausgabe des Befehls führt zu einer der folgenden Optionen:

    1. Wenn das Attribut auf ein leeres Feld gesetzt ist, wird impliziert, dass der Wert überschrieben wird (dies ist ein Header mit bereits vorhandener Konfiguration), damit KEINE doppelten Header und mehrere Werte zulässig sind. Das heißt, Sie dürfen den Expires-Header nicht mehrmals als Teil der HTTP-Anfrage oder HTTP-Antwort an Apigee senden.
    2. Wenn es keine Treffer für die jeweilige Property gibt, wird der Wert nicht überschrieben. Es handelt sich also NICHT um einen Header mit einer vorhandenen Konfiguration. Das bedeutet, dass der spezifische Header mehrmals als Teil der HTTP-Anfrage oder HTTP-Antwort an Apigee Edge gesendet werden kann (Duplikate sind zulässig).
    3. Wenn die Property mit dem Wert allowDuplicates, multiValued festgelegt ist, wird der Wert explizit überschrieben . Es handelt sich dabei um einen Header mit vorhandener Konfiguration. Das bedeutet, dass der spezifische Header als Teil der HTTP-Anfrage oder HTTP-Antwort an Apigee mehrmals gesendet werden kann (Duplikate sind zulässig).

    Beispielausgabe des Suchbefehls:

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

    Die obige Beispielausgabe zeigt, dass die Property HTTPHeader.Expires leer ist. Das bedeutet, dass die Property überschrieben wird, um Duplikate oder mehrere Werte für den Header Expires zu verhindern.

  2. Wenn Sie feststellen, dass die dem jeweiligen Header entsprechende Property ausdrücklich überschrieben wird, um Duplikate oder mehrere Werte zu verhindern, 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. Bearbeiten. 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. Der Inhaber der Properties-Datei muss der Nutzer apigee sein. Falls 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 Neustart ohne Auswirkungen auf den Traffic finden Sie unter Rollback-Neustart 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 Processor.

Prüfen, ob der Header Duplikate und mehrere Werte enthält

In diesem Abschnitt wird beschrieben, wie Sie prüfen, ob die Property HTTPHeader.HEADER_NAME für einen bestimmten Header erfolgreich aktualisiert wurde, um Duplikate in den Nachrichten-Prozessoren zuzulassen.

Wir verwenden Expires als Beispiel für eine Überschrift 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. Suche auf dem Message Processor-Rechner im Verzeichnis /opt/apigee/edge-message-processor/conf nach der Property HTTPHeader.HEADER_NAME und prüfe, ob sie wie unten gezeigt mit dem neuen Wert festgelegt wurde:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

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

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    
  2. Wenn der neue Wert im Message Processor für HTTPHeader.HEADER_NAME festgelegt wurde, zeigt der obige Befehl den neuen Wert in der Datei http.properties an.
  3. Das Beispielergebnis des Befehls oben, nachdem Sie allowDuplicates und multiValued konfiguriert haben, sieht so aus:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
  4. In der Beispielausgabe oben wurde das Attribut HTTPHeader.Expires in http.properties auf den neuen Wert allowDuplicates, multiValued festgelegt. Das bedeutet, dass das Verhalten, das Duplikate und mehrere Werte in HTTPHeader zulässt, im Message Processor erfolgreich konfiguriert wurde.
  5. Wenn Sie weiterhin den alten Wert für die Property HTTPHeader.HEADER_NAME sehen, prüfen Sie, ob Sie alle Schritte unter „allowDuplicates“ und mehrere Werte für Überschriften konfigurieren korrekt ausgeführt haben. Wenn Sie einen Schritt übersprungen 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.

Deaktivierung von „allowDuplicates“ für Header

In diesem Abschnitt wird erläutert, wie Sie das Attribut HTTPHeader.{Headername} so konfigurieren, dass keine Duplikate und mehrere Werte für einen bestimmten HTTP-Header in den Message Processors zulässig sind. Dabei wird das entsprechende Token gemäß der unter Edge konfigurieren beschriebenen Syntax verwendet.

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

  1. Ermitteln Sie den aktuellen Wert des Attributs HTTPHeaderHEADER_NAME und achten Sie darauf, dass es nicht bereits deaktiviert ist, um Duplikate und mehrere Werte mit dem folgenden Befehl zuzulassen:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Wenn Sie beispielsweise versuchen, das Attribut für den Expires-Header festzulegen, prüfen Sie den aktuellen Wert des Attribut-HTTPHeader.Expires-Tokens im Message Processor:

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

    Die Ausgabe des obigen Befehls führt zu einem der folgenden Ereignisse:

    1. Wenn die Property leer ist, wird der Wert überschrieben, um doppelte Überschriften und mehrere Werte zuverhindern. Das heißt, Sie dürfen den Expires-Header nur einmal im Rahmen der HTTP-Anfrage oder der HTTP-Antwort an Apigee senden.
    2. Wenn es keine Treffer für die jeweilige Property gibt, wird der Wert nicht überschrieben und es handelt sich um einen NOT-Header mit einer vorhandenen Konfiguration. Das bedeutet, dass der spezifische Header mehrmals als Teil der HTTP-Anfrage oder HTTP-Antwort an Apigee Edge gesendet werden kann (Duplikate sind zulässig).
    3. Wenn das Attribut auf den Wert allowDuplicates, multiValued festgelegt ist, bedeutet dies, dass der Wert explizit überschrieben wird und dies eine vorhandene Konfiguration ist. Dies bedeutet jedoch, dass der spezifische Header mehrmals als Teil der HTTP-Anfrage oder HTTP-Antwort an Apigee gesendet werden kann (Duplikate sind zulässig).

    Beispielausgabe 1

    Beispielausgabe 1 des Befehls „search“:

    /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 Befehls „search“

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

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

  2. Wenn einer der folgenden Punkte zutrifft, führen Sie die restlichen Schritte in diesem Abschnitt aus:
    1. Die dem jeweiligen Header entsprechende Property 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 in Beispielausgabe 2 oben (kein Header mit vorhandener Konfiguration)

    Andernfalls überspringen Sie die restlichen Schritte in diesem Abschnitt.

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

    Geben Sie beispielsweise Folgendes ein, um die Datei mit vi zu öffnen:

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

    Vorhandene Konfiguration

    Szenario 1: Header mit vorhandener Konfiguration:

    conf_http_HTTPHeader.Expires=

    Keine vorhandene Konfiguration

    Szenario 2: Keine Überschrift mit vordefinierter Konfiguration:

    conf/http.properties+HTTPHeader.myheader=
  5. Speichern Sie die Änderungen.
  6. Der Inhaber der Properties-Datei muss der Nutzer apigee sein. Ist dies nicht der Fall, 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 Neustart ohne Auswirkungen auf den Traffic finden Sie unter Rollback-Neustart 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 Processor.

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

In diesem Abschnitt wird beschrieben, wie Sie prüfen, ob die Property HTTPHeader.HEADER_NAME für einen bestimmten Header erfolgreich aktualisiert wurde, damit keine Duplikate in den Message Processors zulässig sind.

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

  1. Suche auf dem Message Processor-Rechner im Verzeichnis /opt/apigee/edge-message- processor/conf nach der Property HTTPHeader.HEADER_NAME und prüfe, ob sie wie unten gezeigt mit dem neuen Wert festgelegt wurde:

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

    Wenn Sie beispielsweise prüfen möchten, ob für das Attribut HTTPHeader.Expires der neue Wert festgelegt ist, können Sie den folgenden Befehl ausführen:

    Vorhandene Konfiguration

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

    Keine bereits 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 Nachrichtenprozessor erfolgreich festgelegt wurde, wird der neue Wert mit dem Befehl oben in der Datei http.properties angezeigt.
  3. Nach dem Deaktivieren von allowDuplicates sieht das Ergebnis des obigen Befehls so aus:

    Vorhandene Konfiguration

    Szenario 1: Expiration-Header (Header mit bereits vorhandener Konfiguration)

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

    Keine vorhandene Konfiguration

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

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.myheader=
  4. In der Beispielausgabe oben ist zu sehen, dass das Attribut HTTPHeader.Expires ( und HTTPHeader.myheader) auf den neuen Wert {blank} in http.properties festgelegt wurde. Dies weist darauf hin, dass das Zulassen von Duplikaten und mehreren Werten für den spezifischen HTTP-Header Expires (und myheader) im Message Processor erfolgreich deaktiviert ist.
  5. Wenn weiterhin der alte Wert für die Property HTTPHeader.Expires (or HTTPHeader.myheader) angezeigt wird, prüfen Sie, ob Sie alle Schritte unter „allowDuplicates“ und mehrere Werte für Überschriften konfigurieren korrekt ausgeführt haben. Wenn Sie einen Schritt übersprungen 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.