Настройка обработчиков сообщений для разрешения дублирования заголовков

Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee
X.info

В соответствии со спецификацией HTTP RFC 7230, раздел 3.2.2: Порядок полей , Apigee Edge ожидает, что HTTP-запрос от клиента или HTTP-ответ от бэкэнд-сервера не будут содержать один и тот же заголовок, передаваемый более одного раза с одинаковыми или разными значениями, за исключением случаев, когда для конкретного заголовка существует исключение, допускающее наличие дубликатов.

По умолчанию Apigee Edge разрешает передачу дубликатов и множественных значений в большинство HTTP-заголовков. Однако он не разрешает передачу некоторых заголовков, перечисленных в списке «Заголовки, в которых не допускается наличие дубликатов и множественных значений» . Поэтому:

  • Вы получите ошибку 400 Bad Request с кодом ошибки protocol.http.DuplicateHeader , если клиент отправляет HTTP-запрос с определенным заголовком более одного раза или с несколькими значениями для заголовков HTTP, которые не допускаются к дублированию/множественному использованию в Apigee Edge.
  • Аналогично, вы получите ошибку 502 Bad Gateway с кодом ошибки protocol.http.DuplicateHeader , если бэкэнд-сервер отправляет HTTP-ответ с определенным заголовком более одного раза или с несколькими значениями для HTTP-заголовков, которые не допускаются к дублированию или множественным значениям в Apigee Edge.

Рекомендуемое решение для устранения этих ошибок — исправить клиентское приложение и серверную часть таким образом, чтобы они не отправляли дублирующиеся заголовки и соответствовали спецификации RFC 7230, раздел 3.2.2: Порядок полей, как описано в следующих руководствах по устранению неполадок:

Однако в некоторых случаях может потребоваться добавить исключение, чтобы включить дубликаты и множественные значения для некоторых HTTP-заголовков. В таких ситуациях можно разрешить дублирующиеся заголовки и множественные значения для определенного HTTP-заголовка, установив свойство HTTPHeader. HEADER_NAME на уровне обработчика сообщений.

В этом документе представлена ​​информация об этом свойстве, объясняется, как включить это свойство, чтобы избежать вышеупомянутых ошибок, и приводятся лучшие практики в этой области.

Свойства заголовка HTTP, разрешающие дублирование и множественные значения.

Apigee Edge предоставляет следующие два свойства для управления поведением, позволяющим разрешать дублирование и множественные значения в заголовках HTTP. Обратите внимание, что их можно настроить только в обработчиках сообщений, используя синтаксис токенов, описанный в разделе «Как настроить Edge» .

Название объекта недвижимости Описание Допустимые значения
HTTPHeader. ANY

Это свойство указывает, допускаются ли дублирующиеся или множественные значения для всех HTTP-заголовков, включая пользовательские заголовки, отправляемые в составе HTTP-запроса клиентом или HTTP-ответа, отправляемого бэкэнд-сервером в Apigee Edge.

Значение по умолчанию:

multiValued, allowDuplicates,

  1. blank : Дублирование и множественные значения в заголовках HTTP не допускаются.
  2. multiValued : Разделяет многозначный заголовок на несколько заголовков. Для HTTP-заголовков допускается несколько значений, но дубликаты не допускаются. Значение multiValued включено, что означает, что test-header=a,b будет преобразовано в test-header=a и test-header=b.
  3. allowDuplicates : Разрешает наличие нескольких (дублирующихся) HTTP-заголовков с одинаковым именем.
  4. multiValued, allowDuplicates : В заголовках HTTP разрешены как множественные значения, так и дубликаты.

HTTPHeader. HEADER_NAME

Это свойство используется для переопределения поведения конкретного заголовка по сравнению с тем, что указано в HTTPHeader. ANY

То же самое, что и выше.

Заголовки, в которых не допускается наличие дубликатов и множественных значений.

Как объяснялось ранее, Apigee Edge по умолчанию разрешает дублирование и множественные значения для большинства HTTP-заголовков. Это связано с тем, что свойство HTTPHeader. ANY настроено со значением multiValued, allowDuplicates.

Конфигурация перезаписана.

Для некоторых конкретных заголовков конфигурация по умолчанию перезаписывается одним из следующих способов:

  • HTTPHeader. HEADER_NAME =multiValued, allowDuplicates

    Данная конфигурация не изменяет поведение по умолчанию . То есть, в конкретном заголовке допускается наличие дубликатов и множественных значений.

    .
  • HTTPHeader. HEADER_NAME =

    Эта конфигурация изменяет поведение по умолчанию . То есть, конкретный заголовок не может содержать дубликатов и множественных значений .

Определение заголовков, в которых не допускается наличие дубликатов и множественных значений.

В этом разделе описывается, как определить следующее:

  • В настройках Apigee Edge Private Cloud не допускается наличие дубликатов и множественных значений в заголовках, а также
  • Конкретные заголовки с уже существующей конфигурацией
  1. На машине обработчика сообщений найдите свойство HTTPHeader. в каталоге /opt/apigee/edge-message-processor/conf как показано ниже:

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

    Пример выходных данных:

    # 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. Как пояснялось в разделе «Перезапись конфигурации» , обратите внимание на следующую информацию в приведенном выше примере выходных данных:
    1. HTTP-заголовок Connection перезаписывается, но допускается наличие дубликатов и множественных значений.
    2. HTTP-заголовки Host и Expires перезаписываются и не допускают наличия дубликатов и множественных значений.
    3. В заголовке HTTP Date происходит перезапись, допускается наличие дубликатов, но не допускается наличие нескольких значений.
    4. Все заголовки, которые здесь отображаются ( Connection , Host , Expires и Date в приведенном выше примере), в этом документе называются заголовками с уже существующей конфигурацией .

Поведение Apigee Edge

В таблице ниже описано поведение Apigee Edge при отправке заголовков в виде дубликатов и с несколькими значениями в зависимости от того, как настроены свойства HTTPHeader в обработчиках сообщений, с примером HTTPHeader test-header .

Запрос Исходные заголовки формируются на основе значения conf/http.properties+HTTPHeader.test-header=
<Пустое место> allowDuplicates многозначный allowDuplicates, multiValued (DEFAULT)
test‑header=a,b test‑header=a,b test‑header=a,b

protocol.http.
DuplicateHeader

Внутри системы мы разделяем test-header=a,b на следующие части:

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

и затем возникает ошибка DuplicateHeader .

test‑header=a,b

Внутри системы мы разделяем test-header=a,b на следующие части:

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

но затем исходная форма отправляется в целевую систему.

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

Прежде чем начать

Прежде чем выполнять действия, описанные в этом документе, убедитесь, что вы понимаете, как настраивать параметры Edge в частном облаке, как описано в разделе «Как настроить Edge» .

Настройка параметра allowDuplicates и нескольких значений для заголовков.

Как поясняется в разделе о свойствах HTTP-заголовков, разрешающих дубликаты и множественные значения, значение свойства HTTPHeader. ANY = allowDuplicates, multiValued означает, что в Apigee Edge разрешены дубликаты и множественные значения для всех заголовков. Однако существуют определенные заголовки, значения которых явно переопределяются, чтобы не допускать дубликатов или множественных значений, с помощью свойства HTTPHeader. HEADER_NAME .

В этом разделе объясняется, как настроить свойство HTTPHeader. HEADER_NAME , чтобы разрешить дублирование и множественные значения для любых таких HTTP-заголовков в обработчиках сообщений, используя соответствующий токен в соответствии с синтаксисом, описанным в разделе «Как настроить Edge» .

В этом разделе мы будем использовать Expiresmyheader ) в качестве примера заголовка, для которого мы хотим разрешить дублирование и множественные значения, как описано ниже:

  1. Чтобы убедиться, что для свойства HTTPHeader HEADER_NAME еще не разрешены дубликаты и множественные значения, используйте следующую команду:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Например, если вы пытаетесь установить свойство заголовка Expires , проверьте текущее значение свойства HTTPHeader.Expires token в обработчике сообщений:

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

    Результатом выполнения указанной выше команды является один из следующих вариантов:

    1. Если для этого свойства установлено пустое значение, это означает, что значение перезаписывается (и это заголовок с уже существующей конфигурацией ), чтобы НЕ допускать дублирования заголовков и множественных значений. То есть, вам не разрешается отправлять заголовок Expires более одного раза в рамках HTTP-запроса или HTTP-ответа в Apigee.
    2. Если совпадений по конкретному свойству нет, это означает, что значение не перезаписывается (и это НЕ заголовок с уже существующей конфигурацией ). Это значит, что данный заголовок может быть отправлен более одного раза (допускаются дубликаты) в составе HTTP-запроса или HTTP-ответа в Apigee Edge.
    3. Если свойство установлено со значением allowDuplicates, multiValued это означает, что значение явно перезаписывается (и это заголовок с уже существующей конфигурацией ). Это значит, что конкретный заголовок может быть отправлен более одного раза (дубликаты разрешены) в составе HTTP-запроса или HTTP-ответа в Apigee.

    Пример вывода команды поиска:

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

    Приведенный выше пример выходных данных показывает, что свойство HTTPHeader.Expires имеет пустое значение. Это означает, что свойство перезаписано , чтобы не допускать дублирования или множественных значений для заголовка Expires .

  2. Если вы заметили, что свойство, соответствующее конкретному заголовку, явно переопределено , чтобы не допускать дублирования или множественных значений, как в приведенном выше примере, только тогда выполняйте следующие шаги. Если оно не переопределено явно, пропустите остальные шаги в этом разделе.
  3. Редактировать. Если его нет, вы можете его создать:
    /opt/apigee/customer/application/message-processor.properties

    Например, чтобы открыть файл с помощью vi , введите следующее:

    vi /opt/apigee/customer/application/message-processor.properties
    
  4. Добавьте строку в следующем формате:
    conf_http_HTTPHeader.Expires=allowDuplicates, multiValued
  5. Сохраните изменения.
  6. Убедитесь, что файл свойств принадлежит пользователю apigee . Если это не так, выполните следующую команду:

    chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
    
  7. Перезапустите обработчик сообщений:

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

    Для перезапуска без влияния на трафик см. раздел «Постепенный перезапуск обработчиков сообщений без влияния на трафик» .

  8. Если у вас несколько обработчиков сообщений, повторите описанные выше шаги для всех обработчиков сообщений.

Проверка того, настроен ли заголовок на наличие дубликатов и множественных значений.

В этом разделе объясняется, как проверить, что свойство HTTPHeader. HEADER_NAME для конкретного заголовка было успешно обновлено, чтобы разрешить дубликаты в обработчиках сообщений.

В качестве примера заголовка мы будем использовать Expires и проверим, было ли обновлено соответствующее свойство HTTPHeader.Expires .

Даже если вы используете токен conf_http_HTTPHeader.Expires для обновления значения в обработчике сообщений, необходимо убедиться, что фактическое свойство HTTPHeader.Expires было установлено с новым значением.

  1. На машине обработчика сообщений найдите свойство HTTPHeader. HEADER_NAME в каталоге /opt/apigee/edge-message-processor/conf и проверьте, установлено ли для него новое значение, как показано ниже:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Например, если вы хотите проверить, что свойство HTTPHeader.Expires установлено на новое значение, выполните следующую команду:

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    
  2. Если новое значение для HTTPHeader. HEADER_NAME успешно установлено в обработчике сообщений, то приведенная выше команда отобразит новое значение в файле http.properties .
  3. Пример результата выполнения приведенной выше команды после настройки параметров allowDuplicates и multiValued выглядит следующим образом:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
  4. В приведенном выше примере обратите внимание, что свойство HTTPHeader.Expires было установлено с новым значением allowDuplicates, multiValued в http.properties . Это указывает на то, что поведение, разрешающее дубликаты и множественные значения в HTTPHeader , успешно настроено в обработчике сообщений.
  5. Если вы по-прежнему видите старое значение свойства HTTPHeader. HEADER_NAME , убедитесь, что вы правильно выполнили все шаги, описанные в разделе «Настройка разрешения дубликатов и множественных значений для заголовков» . Если вы пропустили какой-либо шаг, повторите все шаги заново.

    Убедитесь, что ваши прокси-серверы работают должным образом, особенно если в них реализована логика получения и установки заголовков.

  6. Если вам по-прежнему не удаётся изменить это свойство, обратитесь в службу поддержки Apigee Edge.

Отключение параметра allowDuplicates для заголовков

В этом разделе объясняется, как настроить свойство HTTPHeader.{Headername} чтобы предотвратить дублирование и множественные значения для определенного HTTP-заголовка в обработчиках сообщений, используя соответствующий токен в соответствии с синтаксисом, описанным в разделе «Как настроить Edge» .

В этом разделе мы будем использовать заголовок Expiresmyheader ) в качестве примера заголовка, для которого мы не хотим допускать дубликатов, как объяснено ниже:

  1. Чтобы убедиться, что параметр HTTPHeader HEADER_NAME еще не отключен для разрешения дубликатов и множественных значений, используйте следующую команду:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Например, если вы пытаетесь установить свойство заголовка Expires , проверьте текущее значение свойства HTTPHeader.Expires token в обработчике сообщений:

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

    Результатом выполнения указанной выше команды является один из следующих вариантов:

    1. Если для этого свойства установлено пустое значение, это означает, что значение перезаписывается, чтобы не допускать дублирования заголовков и множественных значений . То есть, вам не разрешается отправлять заголовок Expires более одного раза в рамках HTTP-запроса или HTTP-ответа в Apigee.
    2. Если совпадений по конкретному свойству нет, это означает, что значение не перезаписывается , и это заголовок NOT с уже существующей конфигурацией . Это значит, что данный заголовок может быть отправлен более одного раза (допускаются дубликаты) в составе HTTP-запроса или HTTP-ответа в Apigee Edge.
    3. Если свойство установлено со значением allowDuplicates, multiValued это означает, что значение явно переопределяется, и это существующая конфигурация . Однако это означает, что конкретный заголовок может быть отправлен более одного раза (дубликаты разрешены) в составе HTTP-запроса или HTTP-ответа в Apigee.

    Пример выходных данных #1

    Пример выходных данных команды поиска №1:

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

    В приведенном примере выходных данных видно, что свойство HTTPHeader.Expires установлено в значение allowDuplicates, multiValued . Это означает, что свойство переопределено, чтобы разрешить дублирование или множественные значения для заголовка Expires .

    Пример выходных данных #2

    Пример команды и вывода №2 команды поиска

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

    В приведенном примере вывод отсутствует, что подразумевает, что свойство HTTPHeader.myheader по умолчанию имеет значение allowDuplicates, multiValued . Это также означает, что свойство не переопределяется для заголовка myheader.

  2. Если вы заметили один из следующих признаков, выполните остальные действия, описанные в этом разделе:
    1. Свойство, соответствующее конкретному заголовку, перезаписывается, чтобы разрешить дублирование и множественные значения, как в примере выходных данных №1 выше (заголовок с существующей конфигурацией ).
    2. Для свойства, соответствующего конкретному заголовку, как в примере выходных данных №2 выше (не заголовку с уже существующей конфигурацией ), совпадений не обнаружено.

    В противном случае пропустите остальные шаги в этом разделе.

  3. Отредактируйте следующий файл. Если он не существует, вы можете его создать.
    /opt/apigee/customer/application/message-processor.properties

    Например, чтобы открыть файл с помощью vi , введите следующее:

    vi /opt/apigee/customer/application/message-processor.properties
    
  4. Добавьте в файл свойств строку следующего формата:

    Существующая конфигурация

    Сценарий №1: Заголовок с уже существующей конфигурацией:

    conf_http_HTTPHeader.Expires=

    Предварительно настроенная конфигурация отсутствует

    Сценарий №2: Нет заголовка с уже существующей конфигурацией:

    conf/http.properties+HTTPHeader.myheader=
  5. Сохраните изменения.
  6. Убедитесь, что файл свойств принадлежит пользователю apigee . Если это не так, выполните следующее:
    chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
    
  7. Перезапустите обработчик сообщений:
    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
    

    Для перезапуска без влияния на трафик см. раздел «Постепенный перезапуск обработчиков сообщений без влияния на трафик» .

  8. Если у вас несколько обработчиков сообщений, повторите описанные выше шаги для всех обработчиков сообщений.

Проверка правильности настройки заголовка таким образом, чтобы он не допускал дубликатов и множественных значений.

В этом разделе объясняется, как проверить, что свойство HTTPHeader. HEADER_NAME для конкретного заголовка было успешно обновлено, чтобы предотвратить появление дубликатов в обработчиках сообщений.

В качестве примера заголовка мы будем использовать Expiresmyheader ) и проверим, было ли обновлено соответствующее свойство HTTPHeader.ExpiresHTTPHeader.myheader ).

  1. На машине обработчика сообщений найдите свойство HTTPHeader. HEADER_NAME в каталоге /opt/apigee/edge-message- processor/conf и проверьте, установлено ли для него новое значение, как показано ниже:

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

    Например, если вы хотите проверить, установлено ли новое значение для свойства HTTPHeader.Expires , вы можете выполнить следующую команду:

    Существующая конфигурация

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

    Предварительно настроенная конфигурация отсутствует

    grep -ri "HTTPHeader.myheader" /opt/apigee/edge-message-processor/conf
    
  2. Если новое значение заголовка HTTP успешно установлено для HTTPHeader. HEADER_NAME I в обработчике сообщений, то приведенная выше команда отобразит новое значение в файле http.properties .
  3. Пример результата выполнения приведенной выше команды после отключения параметра allowDuplicates выглядит следующим образом:

    Существующая конфигурация

    Сценарий №1 : Заголовок Expires ( заголовок с уже существующей конфигурацией)

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

    Предварительно настроенная конфигурация отсутствует

    Сценарий №2: заголовок myheader (не заголовок с уже существующей конфигурацией)

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.myheader=
  4. В приведенном выше примере обратите внимание, что свойство HTTPHeader.ExpiresHTTPHeader.myheader ) было установлено с новым значением { blank} в http.properties . Это указывает на то, что поведение, разрешающее дублирование и множественные значения для конкретного HTTP-заголовка Expiresmyheader ), успешно отключено в обработчике сообщений.
  5. Если вы по-прежнему видите старое значение свойства HTTPHeader.Expires (or HTTPHeader.myheader) , убедитесь, что вы правильно выполнили все шаги, описанные в разделе «Настройка разрешения дубликатов и множественных значений для заголовков» . Если вы пропустили какой-либо шаг, повторите все шаги еще раз, правильно выполнив их.

    Убедитесь, что ваши прокси-серверы работают должным образом, особенно если в них реализована логика получения и установки заголовков.

  6. Если вам по-прежнему не удаётся изменить это свойство, обратитесь в службу поддержки Apigee Edge .