Konfigurowanie procesorów zezwalających na używanie zduplikowanych nagłówków

Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
Informacje

Zgodnie ze specyfikacją HTTP RFC 7230: sekcja 3.2.2: Kolejność pól Apigee Edge oczekuje, że żądanie HTTP z klienta lub serwera backendu nie będzie zawierać tego samego nagłówka przekazanego więcej niż raz z tymi samymi lub różnymi wartościami, chyba że konkretny nagłówek ma wyjątek i może mieć duplikaty.

Domyślnie Apigee Edge zezwala na przekazywanie duplikatów i wielu wartości do większości nagłówków HTTP. Nie zezwala jednak na niektóre nagłówki wymienione w sekcji Nagłówki, które nie mogą mieć duplikatów i wielu wartości. Dlatego:

  • Otrzymasz 400 Bad Request z kodem błędu protocol.http.DuplicateHeader, jeśli klient wyśle żądanie HTTP z danym nagłówkiem więcej niż raz lub z wieloma wartościami nagłówków HTTP, które nie mogą mieć duplikatów lub wielu wartości w Apigee Edge.
  • Podobnie, w przypadku nagłówka HTTP otrzymasz 502 Bad Gateway z kodem błędu protocol.http.DuplicateHeader, jeśli serwer backendu wyśle odpowiedź HTTP z danym nagłówkiem więcej niż raz lub z wieloma wartościami nagłówków HTTP, które nie mogą mieć duplikatów ani wielu wartości w Apigee Edge

Zalecanym rozwiązaniem w przypadku tych błędów jest naprawienie aplikacji klienckiej i serwera backendu tak, aby nie wysyłały zduplikowanych nagłówków, oraz przestrzeganie specyfikacji RFC 7230, sekcja 3.2.2: Kolejność pól, jak opisano w tych scenariuszach rozwiązywania problemów:

W niektórych przypadkach możesz jednak dodać wyjątek, który będzie uwzględniać duplikaty i wiele wartości w przypadku niektórych nagłówków HTTP. W takich sytuacjach możesz zezwolić na zduplikowane nagłówki i wiele wartości w określonym nagłówku HTTP, ustawiając właściwość HTTPHeader.HEADER_NAME na poziomie procesora wiadomości.

Ten dokument zawiera informacje o tej usłudze oraz wyjaśnia, jak włączyć tę usługę, aby uniknąć powyższych błędów. Przedstawiamy też sprawdzone metody dotyczące tej usługi.

Właściwości nagłówka HTTP pozwalające na dodawanie duplikatów i wielu wartości

Apigee Edge udostępnia 2 poniższe właściwości, które pozwalają kontrolować zachowanie dotyczące zezwalania na duplikaty i wiele wartości nagłówków HTTP. Pamiętaj, że można je skonfigurować tylko w procesorach wiadomości przy użyciu składni tokenów opisanej w artykule Jak skonfigurować Edge.

nazwa usługi, Opis Dozwolone wartości
HTTPHeader.ANY

Ta właściwość wskazuje, czy dla wszystkich nagłówków HTTP, w tym nagłówków niestandardowych wysyłanych w ramach żądania HTTP wysyłanego przez klienta lub odpowiedzi HTTP wysyłanej przez serwer backendu do Apigee Edge, dozwolone są duplikaty czy wiele wartości.

Wartość domyślna:

multivalued, allowDuplicate,

  1. blank: duplikaty i wiele wartości nagłówków HTTP są niedozwolone.
  2. multiValued: podziel nagłówek wielowartościowy na kilka nagłówków. W nagłówku HTTP można podać wiele wartości, ale duplikaty nie są dozwolone. Wartość multiValued jest włączona, co oznacza, że test-header=a,b zostanie przekonwertowany na test-header=a i test-header=b.
  3. allowDuplicate: pozwala na wiele (zduplikowanych) nagłówków HTTP o tej samej nazwie.
  4. multivalued, allowDuplicate: nagłówki HTTP mogą zawierać wiele wartości i duplikaty.

HTTPHeader.HEADER_NAME

Ta właściwość służy do zastępowania działania konkretnego nagłówka względem właściwości HTTPHeader.ANY

Jak wyżej

Nagłówki, które nie mogą mieć duplikatów i wielu wartości

Jak wyjaśniliśmy wcześniej, Apigee Edge domyślnie zezwala na duplikaty i wiele wartości w przypadku większości nagłówków HTTP. Dzieje się tak, ponieważ właściwość HTTPHeader.ANY jest skonfigurowana z wartością multivalued, allowDuplicate.

Konfiguracja została zastąpiona

W przypadku niektórych nagłówków domyślna konfiguracja jest zastępowana jedną z tych metod:

  • HTTPHeader.HEADER_NAME=multivalued, allowDuplicate

    Ta konfiguracja nie zmienia domyślnego działania. Oznacza to, że dany nagłówek może mieć duplikaty i wiele wartości.

    .
  • HTTPHeader.HEADER_NAME=

    Ta konfiguracja zmienia działanie domyślne. Oznacza to, że konkretny nagłówek nie może mieć duplikatów i kilku wartości.

Określanie nagłówków, które nie mogą mieć duplikatów i wielu wartości

Z tej sekcji dowiesz się, jak rozpoznać:

  • określone nagłówki, które nie mogą mieć duplikatów i wielu wartości w konfiguracji Apigee Edge Private Cloud; oraz
  • konkretne nagłówki z wcześniejszą konfiguracją;
  1. Na komputerze procesora wiadomości wyszukaj właściwość HTTPHeader. w katalogu /opt/apigee/edge-message-processor/conf, jak pokazano poniżej:

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

    Przykładowe wyniki:

    # 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. Zgodnie z opisem w sekcji Zastąpiona konfiguracja zwróć uwagę na te informacje w przykładowych danych wyjściowych powyżej:
    1. Nagłówek HTTP Connection zostanie zastąpiony, ale może mieć duplikaty i wiele wartości
    2. Nagłówki HTTP Host i Expires zostaną zastąpione i nie mogą mieć duplikatów ani wielu wartości
    3. Nagłówek HTTP Date zostanie zastąpiony i może mieć duplikaty, ale nie może zawierać wielu wartości
    4. Wszystkie nagłówki w tym miejscu (Connection, Host, Expires i Date w powyższym przykładzie) są określane jako nagłówki z wstępnie istniejącą konfiguracją w tym dokumencie.

Działanie Apigee Edge

W tabeli poniżej opisano zachowanie Apigee Edge, gdy nagłówki są wysyłane jako duplikaty i z wieloma wartościami w zależności od konfiguracji właściwości HTTPHeader w procesorach wiadomości. Przykład HTTPHeader z test-header.

Prośba Wychodzące nagłówki nagłówków na podstawie wartości conf/http.properties+HTTPHeader.test-header=
<Puste> allowDuplicate multiValued allowDuplikat, wielowartościowy (DOMYŚLNY)
test‑header=a,b test‑header=a,b test‑header=a,b

protocol.http.
DuplicateHeader

Wewnętrzne podzieliliśmy test-header=a,b na:

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

po czym zgłaszany jest błąd DuplicateHeader.

test‑header=a,b

Wewnętrzne podzieliliśmy test-header=a,b na:

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

ale następnie wysyłany jest pierwotny formularz.

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

Zanim zaczniesz

Zanim wykonasz czynności opisane w tym dokumencie, upewnij się, że rozumiesz konfigurowanie właściwości Edge w Private Cloud. Opisaliśmy w artykule Jak skonfigurować Edge.

Konfigurowanie zezwalania na duplikaty i wielu wartości dla nagłówków

Jak wyjaśniono w sekcji Właściwości nagłówka HTTP pozwalające na dopuszczanie duplikatów i wielu wartości, wartość właściwości HTTPHeader.ANY = allowDuplicates, multivalued wskazuje, że w Apigee Edge wszystkie nagłówki mogą mieć duplikaty i wiele wartości. Istnieją jednak niektóre nagłówki, których wartości są zastępowane jawnie, aby zapobiec powielaniu nagłówków lub wielu wartości za pomocą właściwości HTTPHeader.HEADER_NAME.

W tej sekcji wyjaśniono, jak skonfigurować właściwość HTTPHeader.HEADER_NAME, aby zezwolić na duplikaty i wiele wartości takich nagłówków HTTP w procesorach wiadomości przy użyciu odpowiedniego tokena zgodnie ze składnią opisaną w artykule Jak skonfigurować Edge.

W tej sekcji użyjemy Expires (i myheader) jako przykładowego nagłówka, dla którego chcemy zezwolić na duplikaty i wiele wartości, tak jak to wyjaśniliśmy poniżej:

  1. Określ bieżącą wartość właściwości HTTPHeaderHEADER_NAME, aby upewnić się, że nie jest ona już włączona, co pozwala na używanie duplikatów i wartości za pomocą tego polecenia:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Jeśli na przykład próbujesz ustawić właściwość nagłówka Expires, sprawdź bieżącą wartość tokena HTTPHeader.Expires w procesorze wiadomości:

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

    Wyniki tego polecenia mogą mieć jeden z tych efektów:

    1. Właściwość jest ustawiona jako pusta, co oznacza, że wartość została zastąpiona (i jest to nagłówek z wstępnie istniejącą konfiguracją), co NIE zezwala na zduplikowane nagłówki i wiele wartości. Oznacza to, że nie możesz wysyłać nagłówka Expires więcej niż raz w ramach żądania HTTP lub odpowiedzi HTTP do Apigee.
    2. Dla danej właściwości nie ma działań, co oznacza, że wartość nie zostanie zastąpiona (nie jest to nagłówek z wstępnie istniejącą konfiguracją). Oznacza to, że dany nagłówek można wysłać więcej niż raz (dozwolone są duplikaty) w ramach żądania HTTP lub odpowiedzi HTTP do Apigee Edge.
    3. Właściwość jest ustawiona na wartość allowDuplicates, multivalued, co oznacza, że wartość jest jawnie zastąpiona (jest to nagłówek z wstępnie istniejącą konfiguracją). Oznacza to, że dany nagłówek można wysłać więcej niż raz (dozwolone są duplikaty) w ramach żądania HTTP lub odpowiedzi HTTP do Apigee.

    Przykładowe dane wyjściowe polecenia wyszukiwania:

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

    Powyższe przykładowe dane wyjściowe pokazują, że właściwość HTTPHeader.Expires jest ustawiona jako pusta. Oznacza to, że właściwość została zastąpiona, aby nie można było powtarzać ani podawać wielu wartości w nagłówku Expires.

  2. Jeśli zauważysz, że właściwość powiązana z konkretnym nagłówkiem została wyraźnie zastąpiona, by nie zezwalać na powtarzanie lub wielokrotne wartości, jak w przykładach powyżej, tylko wtedy wykonaj te czynności. Jeśli nie jest on wyraźnie zastąpiony, pomiń pozostałe kroki w tej sekcji.
  3. Edytuj. Jeśli nie istnieje, możesz go utworzyć:
    /opt/apigee/customer/application/message-processor.properties
    

    Aby na przykład otworzyć plik za pomocą vi, wpisz:

    vi /opt/apigee/customer/application/message-processor.properties
    
  4. Dodaj wiersz w tym formacie:
    conf_http_HTTPHeader.Expires=allowDuplicates, multiValued
    
  5. Zapisz zmiany.
  6. Upewnij się, że plik właściwości należy do użytkownika apigee. Jeśli nie, wykonaj to polecenie:

    chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
    
  7. Ponownie uruchom procesor wiadomości:

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

    Aby uruchomić ponownie bez wpływu na ruch, zapoznaj się z sekcją o wprowadzaniu ponownego uruchamiania procesorów wiadomości bez wpływu na ruch.

  8. Jeśli masz więcej niż 1 procesor wiadomości, powtórz powyższe kroki na wszystkich procesorach.

Weryfikacja nagłówka jest skonfigurowana tak, aby mieć duplikaty i wiele wartości

W tej sekcji dowiesz się, jak sprawdzić, czy właściwość HTTPHeader.HEADER_NAME określonego nagłówka została zaktualizowana, aby umożliwić duplikowanie danych w procesorach wiadomości.

Użyjemy jako przykładowego nagłówka Expires i sprawdzimy, czy odpowiednia właściwość HTTPHeader.Expires została zaktualizowana.

Mimo że używasz tokena conf_http_HTTPHeader.Expires do aktualizowania wartości w procesorze wiadomości, musisz sprawdzić, czy właściwość HTTPHeader.Expires została ustawiona na nową wartość.

  1. Na komputerze procesora wiadomości wyszukaj właściwość HTTPHeader.HEADER_NAME w katalogu /opt/apigee/edge-message-processor/conf i sprawdź, czy została ona ustawiona z nową wartością, jak pokazano poniżej:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Jeśli np. chcesz sprawdzić, czy nowa wartość jest ustawiona we właściwości HTTPHeader.Expires, uruchom to polecenie:

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    
  2. Jeśli nowa wartość HTTPHeader.HEADER_NAME w procesorze wiadomości zostanie ustawiona, powyższe polecenie wyświetli nową wartość w pliku http.properties.
  3. Przykładowy wynik z powyższego polecenia po skonfigurowaniu allowDuplicates i multiValued wygląda tak:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
    
  4. W powyższych przykładowych danych wyjściowych w http.properties właściwość HTTPHeader.Expires została ustawiona z nową wartością allowDuplicates, multiValued. Wskazuje to, że zachowanie zezwalające na duplikaty i wiele wartości w HTTPHeader jest prawidłowo skonfigurowane w procesorze wiadomości.
  5. Jeśli nadal widzisz starą wartość właściwości HTTPHeader.HEADER_NAME, sprawdź, czy zostały wykonane wszystkie czynności opisane w sekcji Konfigurowanie zezwalania na duplikaty i wielu wartości dla nagłówków. Jeśli pominięto jakiś krok, powtórz wszystkie kroki ponownie.

    Sprawdź, czy serwery proxy działają zgodnie z oczekiwaniami, zwłaszcza jeśli istnieje funkcjonalna logika pobierania i ustawiania nagłówków w serwerze proxy.

  6. Jeśli nadal nie możesz zmodyfikować właściwości, skontaktuj się z zespołem pomocy Apigee Edge.

Wyłączam zezwolenie na duplikatach nagłówków

W tej sekcji wyjaśniamy, jak skonfigurować właściwość HTTPHeader.{Headername} w taki sposób, aby nie zezwalać na zduplikowanie i wiele wartości określonego nagłówka HTTP w procesorach wiadomości przy użyciu odpowiedniego tokena zgodnie ze składnią opisaną w sekcji Jak skonfigurować Edge.

W tej sekcji użyjemy Expires (i myheader) jako przykładowego nagłówka, w przypadku którego nie chcemy zezwalać na duplikaty, tak jak to wyjaśniliśmy poniżej:

  1. Określ bieżącą wartość właściwości HTTPHeaderHEADER_NAME, aby upewnić się, że nie jest już wyłączona. Pozwoli to na dopuszczenie duplikatów i wielu wartości za pomocą tego polecenia:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Jeśli na przykład próbujesz ustawić właściwość nagłówka Expires, sprawdź bieżącą wartość tokena HTTPHeader.Expires w procesorze wiadomości:

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

    Wyniki tego polecenia mogą mieć jeden z tych efektów:

    1. Właściwość jest ustawiona jako pusta, co oznacza, że wartość została zastąpiona NIE, aby umożliwić powielanie nagłówków i wielu wartości. Oznacza to, że nie możesz wysłać nagłówka Expires więcej niż raz w ramach żądania HTTP lub odpowiedzi HTTP do Apigee.
    2. Nie ma działań dla danej właściwości. Oznacza to, że wartość nie zostanie zastąpiona, a jest to nagłówek NIE z wstępnie istniejącą konfiguracją. Oznacza to, że dany nagłówek można wysłać więcej niż raz (dozwolone są duplikaty) w ramach żądania HTTP lub odpowiedzi HTTP do Apigee Edge.
    3. Właściwość ma wartość allowDuplicates, multivalued, co oznacza, że wartość jest jawnie zastąpiona i istniejąca konfiguracja. Oznacza to jednak, że dany nagłówek można wysłać więcej niż raz (dozwolone są duplikaty) w ramach żądania HTTP lub odpowiedzi HTTP do Apigee.

    Przykładowe wyniki nr 1

    Przykładowe dane wyjściowe 1 polecenia wyszukiwania:

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

    Przykładowe dane wyjściowe pokazują, że właściwość HTTPHeader.Expires jest ustawiona na allowDuplicates, multiValued. Oznacza to, że właściwość została zastąpiona, co pozwoli na zduplikowanie lub wielokrotne wartości nagłówka Expires.

    Przykładowe wyniki nr 2

    Przykładowe polecenie i wynik 2 polecenia wyszukiwania

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

    Przykładowe dane wyjściowe nie zawierają żadnych danych wyjściowych, co oznacza, że właściwość HTTPHeader.myheader ma domyślnie wartość allowDuplicates, multiValued. Oznacza to też, że właściwość nie zostanie zastąpiona w nagłówku myheader,

  2. Jeśli zauważysz jedną z poniższych opcji, wykonaj pozostałe czynności opisane w tej sekcji:
    1. Właściwość odpowiadająca konkretnemu nagłówkowi została zastąpiona, aby umożliwić zduplikowanie i wiele wartości, jak w przykładowym wyjściu nr 1 powyżej (nagłówek ze wstępnie istniejącą konfiguracją)
    2. Nie ma działań dla usługi odpowiadającej konkretnemu nagłówkowi, jak w przykładowym wyjściu nr 2 powyżej (a nie nagłówka z już istniejącą konfiguracją).

    W przeciwnym razie pomiń pozostałe kroki opisane w tej sekcji.

  3. Edytuj ten plik. Jeśli nie istnieje, możesz go utworzyć.
    /opt/apigee/customer/application/message-processor.properties
    

    Aby na przykład otworzyć plik za pomocą vi, wpisz:

    vi /opt/apigee/customer/application/message-processor.properties
    
  4. Dodaj do pliku właściwości wiersz w tym formacie:

    Już istnieje

    Scenariusz 1. Nagłówek z gotową konfiguracją:

    conf_http_HTTPHeader.Expires=
    

    Brak wcześniejszej konfiguracji

    Scenariusz 2. To nie jest nagłówek z gotową konfiguracją:

    conf/http.properties+HTTPHeader.myheader=
    
  5. Zapisz zmiany.
  6. Upewnij się, że plik właściwości należy do użytkownika apigee. Jeśli nie, wykonaj to działanie:
    chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
    
  7. Ponownie uruchom procesor wiadomości:
    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
    

    Aby uruchomić ponownie bez wpływu na ruch, zapoznaj się z sekcją o wprowadzaniu ponownego uruchamiania procesorów wiadomości bez wpływu na ruch.

  8. Jeśli masz więcej niż 1 procesor wiadomości, powtórz powyższe kroki na wszystkich procesorach.

Weryfikacja nagłówka jest skonfigurowana tak, aby nie zezwalać na duplikaty i wiele wartości

W tej sekcji dowiesz się, jak sprawdzić, czy właściwość HTTPHeader.HEADER_NAME określonego nagłówka została zaktualizowana, aby zapobiec wyświetlaniu duplikatów w systemach przetwarzania wiadomości.

Użyjemy Expires (i myheader) jako przykładowego nagłówka i sprawdzimy, czy odpowiednia właściwość HTTPHeader.Expires (oraz HTTPHeader.myheader) została zaktualizowana.

  1. Na komputerze procesora wiadomości wyszukaj właściwość HTTPHeader.HEADER_NAME w katalogu /opt/apigee/edge-message- processor/conf i sprawdź, czy została ona ustawiona z nową wartością, jak pokazano poniżej:

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

    Jeśli np. chcesz sprawdzić, czy właściwość HTTPHeader.Expires jest ustawiona na nową wartość, możesz uruchomić to polecenie:

    Już istnieje

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

    Brak wcześniejszej konfiguracji

    grep -ri "HTTPHeader.myheader" /opt/apigee/edge-message-processor/conf
    
  2. Jeśli nowa wartość nagłówka HTTP jest ustawiona na HTTPHeader.HEADER_NAME I w procesorze wiadomości, to polecenie powyżej wyświetla nową wartość w pliku http.properties.
  3. Przykładowy wynik powyższego polecenia po wyłączeniu allowDuplicates wygląda tak:

    Już istnieje

    Scenariusz 1: wygaśnięcie nagłówka (nagłówek z już istniejącą konfiguracją)

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

    Brak wcześniejszej konfiguracji

    Scenariusz 2. Nagłówek myheader (nie nagłówek z gotową konfiguracją)

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.myheader=
    
  4. W podanym wyżej przykładzie zwróć uwagę, że właściwość HTTPHeader.Expires ( oraz HTTPHeader.myheader) została ustawiona na nową wartość {blank} w polu http.properties. Wskazuje to, że zachowanie zezwalające na duplikaty i wiele wartości dla określonego nagłówka HTTP Expires (i myheader) zostało wyłączone w procesorze wiadomości.
  5. Jeśli nadal widzisz starą wartość właściwości HTTPHeader.Expires (or HTTPHeader.myheader), sprawdź, czy zostały wykonane wszystkie czynności opisane w sekcji Konfigurowanie zezwalania na duplikaty i wielu wartości dla nagłówków. Jeśli pominięto jakiś krok, powtórz wszystkie kroki ponownie.

    Sprawdź, czy serwery proxy działają zgodnie z oczekiwaniami, zwłaszcza jeśli istnieje funkcjonalna logika pobierania i ustawiania nagłówków w serwerze proxy.

  6. Jeśli nadal nie możesz zmodyfikować właściwości, skontaktuj się z zespołem pomocy Apigee Edge.