Как настроить обработчики сообщений, чтобы разрешить дублирующиеся заголовки

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

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

По умолчанию Apigee Edge разрешает передавать в большинство HTTP-заголовков дубликаты и несколько значений. Однако некоторые заголовки, перечисленные в разделе Заголовки, которые не могут иметь дубликаты и несколько значений, не допускаются. Далее Search Console действует по следующему алгоритму:

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

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

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

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

Свойства заголовков 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, и
  • Заголовки с pre-existing config
  1. На компьютере Message Processor найдите свойство 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 multiValued allowDuplicates, multiValued (по умолчанию)
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.

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

  1. Определите текущее значение свойства HTTPHeaderHEADER_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. Если для свойства задано значение 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. Перезапустите Message Processor:

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

    Чтобы перезапустить процессор сообщений без влияния на трафик, ознакомьтесь с разделом Поэтапная перезагрузка процессоров сообщений без влияния на трафик.

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

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

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

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

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

  1. На компьютере Message Processor найдите свойство 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 в Message Processor, то указанная выше команда покажет новое значение в файле http.properties.
  3. Пример результата выполнения команды после настройки allowDuplicates и multiValued:

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

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

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

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

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

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

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

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

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

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

    1. Если для свойства задано пустое значение, это означает, что значение iперезаписывается на NOT, чтобы разрешить дублирующиеся заголовки и несколько значений. То есть вы не можете отправлять заголовок 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. Перезапустите Message Processor:
    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
    

    Чтобы перезапустить процессор сообщений без влияния на трафик, ознакомьтесь с разделом Поэтапная перезагрузка процессоров сообщений без влияния на трафик.

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

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

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

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

  1. На компьютере Message Processor найдите свойство 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 в Message Processor, то в файле 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.Expires ( и HTTPHeader.myheader) задано новое значение {blank} в http.properties. Это означает, что поведение, позволяющее дублировать и использовать несколько значений для определенного заголовка HTTP Expires (и myheader), успешно отключено в Message Processor.
  5. Если вы по-прежнему видите старое значение свойства HTTPHeader.Expires (or HTTPHeader.myheader), убедитесь, что вы правильно выполнили все шаги, описанные в разделе Настройка allowDuplicates и нескольких значений для заголовков. Если вы пропустили какой-либо шаг, повторите все действия заново.

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

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