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

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

В соответствии со спецификацией 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. Край

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

Поведение Apigee Edge

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

Запрос Исходящие ЗАГОЛОВКИ на основе значения conf/http.properties+HTTPHeader.test-header=
<Пустой> Разрешить дубликаты многозначный разрешить дубликаты, многозначное (ПО УМОЛЧАНИЮ)
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 .

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

Как поясняется в свойствах заголовка 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 токена в процессоре сообщений:

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

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

    1. Для свойства установлено пустое значение, что означает, что значение перезаписывается (и это заголовок с уже существующей конфигурацией ), чтобы НЕ допускать дублирования заголовков и нескольких значений. То есть вам не разрешено отправлять заголовок Expires более одного раза как часть HTTP-запроса или HTTP-ответа в Apigee.
    2. Для конкретного свойства нет совпадений, то это означает, что значение не перезаписывается (и это НЕ заголовок с уже существующей конфигурацией ). Это означает, что конкретный заголовок может быть отправлен более одного раза (дубликаты допускаются) как часть HTTP-запроса или HTTP-ответа в Apigee Edge.
    3. Свойству присвоено значениеallowDuplications 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 присвоено новое значениеallowDuulates allowDuplicates, multiValued в http.properties . Это указывает на то, что поведение, разрешающее дубликаты и несколько значений в HTTPHeader , успешно настроено в процессоре сообщений.
  5. Если вы все еще видите старое значение свойства HTTPHeader. HEADER_NAME , а затем убедитесь, что вы правильно выполнили все шаги, описанные в разделе Настройка разрешенных дубликатов и нескольких значений для заголовков . Если вы пропустили какой-либо шаг, повторите все шаги еще раз правильно.

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

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

Отключение разрешений для заголовков

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

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

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

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

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

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

    1. Для свойства установлено пустое значение, что означает, что значение перезаписывается на NOT, чтобы допустить дублирование заголовков и несколько значений . То есть вам не разрешено отправлять заголовок Expires более одного раза как часть HTTP-запроса или HTTP-ответа в Apigee.
    2. Для конкретного свойства нет совпадений, то это означает, что значение не перезаписывается и это заголовок NOT с уже существующей конфигурацией . Это означает, что конкретный заголовок может быть отправлен более одного раза (дубликаты допускаются) как часть HTTP-запроса или HTTP-ответа в Apigee Edge.
    3. Свойству присвоено значениеallowDuplications 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 .