Вы просматриваете документацию 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. Значение по умолчанию: |
|
| Это свойство используется для переопределения поведения определенного заголовка по сравнению с тем, что указано в | То же, что и выше. |
Заголовки, которым не разрешено иметь дубликаты и несколько значений.
Как объяснялось ранее, Apigee Edge по умолчанию допускает дубликаты и несколько значений для большинства заголовков HTTP. Это связано с тем, что свойство HTTPHeader. ANY
настроен со значением multiValued, allowDuplicates.
Конфигурация перезаписана
Для некоторых конкретных заголовков конфигурация по умолчанию перезаписывается одним из следующих методов:
HTTPHeader. HEADER_NAME =multiValued, allowDuplicates
Эта конфигурация не меняет поведение по умолчанию . То есть конкретный заголовок может иметь дубликаты и несколько значений.
.HTTPHeader. HEADER_NAME =
Эта конфигурация меняет поведение по умолчанию . То есть конкретный заголовок не может иметь дубликаты и несколько значений .
Определение заголовков, которым не разрешено иметь дубликаты и несколько значений.
В этом разделе описывается, как определить следующее:
- Конкретные заголовки, которым не разрешено иметь дубликаты и несколько значений в настройках частного облака Apigee Edge, и
- Конкретные заголовки с уже существующей конфигурацией
На компьютере процессора сообщений найдите свойство
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>
- Как объяснено в разделе «Перезапись конфигурации» , обратите внимание на следующую информацию в примере выходных данных выше:
-
Connection
HTTP-заголовка перезаписано, но разрешено иметь дубликаты и несколько значений. - Заголовки HTTP
Host
иExpires
перезаписываются, и им не разрешено иметь дубликаты и несколько значений. -
Date
заголовка HTTP перезаписывается и может иметь дубликаты, но не может иметь несколько значений. - Все заголовки, которые появляются здесь (
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 | Внутри мы разделили
а затем выдается ошибка | Внутри мы разделили
но затем исходная форма отправляется в цель. |
test‑header=a test‑header=b | protocol.http. | test‑header=a test‑header=b | protocol.http. | test‑header=a test‑header=b |
Прежде чем начать
Прежде чем использовать действия, описанные в этом документе, убедитесь, что вы понимаете настройку свойств Edge в частном облаке, описанную в разделе Как настроить Edge .
НастройкаallowDuulates и нескольких значений для заголовков
Как поясняется в свойствах заголовка HTTP, чтобы разрешить дубликаты и несколько значений, значение свойства HTTPHeader. ANY = allowDuplicates, multiValued
подразумевает, что все заголовки могут иметь дубликаты и несколько значений в Apigee Edge. Однако существуют определенные заголовки, значения которых явно перезаписываются, чтобы не допустить дублирования заголовков или нескольких значений с помощью свойства HTTPHeader. HEADER_NAME
.
В этом разделе объясняется, как настроить свойство HTTPHeader. HEADER_NAME
чтобы разрешить дубликаты и множественные значения для любых таких заголовков HTTP в процессорах сообщений, используя соответствующий токен в соответствии с синтаксисом, описанным в разделе Как настроить Edge .
В этом разделе мы будем использовать Expires
(и myheader
) в качестве примера заголовка, для которого мы хотим разрешить дубликаты и несколько значений, как описано ниже:
- Определите текущее значение свойства
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
Вывод приведенной выше команды приводит к одному из следующих результатов:
- Для свойства установлено пустое значение, что означает, что значение перезаписывается (и это заголовок с уже существующей конфигурацией ), чтобы НЕ допускать дублирования заголовков и нескольких значений. То есть вам не разрешено отправлять заголовок
Expires
более одного раза как часть HTTP-запроса или HTTP-ответа в Apigee. - Для конкретного свойства нет совпадений, то это означает, что значение не перезаписывается (и это НЕ заголовок с уже существующей конфигурацией ). Это означает, что конкретный заголовок может быть отправлен более одного раза (дубликаты допускаются) как часть HTTP-запроса или HTTP-ответа в Apigee Edge.
- Свойству присвоено значениеallowDuplications
allowDuplicates, multiValued
тогда это означает, что значение перезаписывается явно (и это заголовок с уже существующей конфигурацией ). Это означает, что конкретный заголовок может быть отправлен более одного раза (дубликаты допускаются) как часть HTTP-запроса или HTTP-ответа Apigee.
Пример вывода команды поиска:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=
В приведенном выше примере выходных данных показано, что для свойства
HTTPHeader.Expires
установлено пустое значение. Это означает, что свойство перезаписывается, чтобы не допустить дублирования или нескольких значений для заголовкаExpires
. - Для свойства установлено пустое значение, что означает, что значение перезаписывается (и это заголовок с уже существующей конфигурацией ), чтобы НЕ допускать дублирования заголовков и нескольких значений. То есть вам не разрешено отправлять заголовок
- Если вы заметили, что свойство, соответствующее конкретному заголовку , явно перезаписано, чтобы не допустить дублирования или множественных значений, как в примере выше, только тогда выполните следующие шаги. Если он не перезаписан явно, пропустите остальные шаги этого раздела.
- Редактировать. Если он не существует, вы можете его создать:
/opt/apigee/customer/application/message-processor.properties
Например, чтобы открыть файл с помощью vi , введите следующее:
vi /opt/apigee/customer/application/message-processor.properties
- Добавьте строку в следующем формате:
conf_http_HTTPHeader.Expires=allowDuplicates, multiValued
- Сохраните изменения.
Убедитесь, что файл свойств принадлежит пользователю
apigee
. Если это не так, выполните следующую команду:chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
Перезапустите процессор сообщений:
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
Чтобы перезапустить без влияния на трафик, см. Последовательный перезапуск процессоров сообщений без влияния на трафик .
- Если у вас более одного процессора сообщений, повторите вышеуказанные шаги для всех процессоров сообщений.
Проверка того, что заголовок настроен на наличие дубликатов и нескольких значений.
В этом разделе объясняется, как проверить, что свойство HTTPHeader. HEADER_NAME
для определенного заголовка был успешно обновлен, чтобы разрешить дублирование в процессорах сообщений.
Мы будем использовать Expires
в качестве примера заголовка и проверим, было ли обновлено соответствующее свойство HTTPHeader.Expires
.
Даже если вы используете токен conf_http_HTTPHeader.Expires
для обновления значения в процессоре сообщений, вам необходимо проверить, установлено ли фактическое свойство HTTPHeader.Expires
с новым значением.
- На компьютере процессора сообщений найдите свойство
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
- Если новое значение успешно установлено для
HTTPHeader. HEADER_NAME
в процессоре сообщений, то приведенная выше команда покажет новое значение в файлеhttp.properties
. Пример результата выполнения приведенной выше команды после настройки
allowDuplicates
иmultiValued
выглядит следующим образом:/opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
- Обратите внимание, что в приведенном выше примере вывода свойству
HTTPHeader.Expires
присвоено новое значениеallowDuulatesallowDuplicates, multiValued
вhttp.properties
. Это указывает на то, что поведение, разрешающее дубликаты и несколько значений вHTTPHeader
, успешно настроено в процессоре сообщений. - Если вы все еще видите старое значение свойства
HTTPHeader. HEADER_NAME
, а затем убедитесь, что вы правильно выполнили все шаги, описанные в разделе Настройка разрешенных дубликатов и нескольких значений для заголовков . Если вы пропустили какой-либо шаг, повторите все шаги еще раз правильно.Убедитесь, что ваши прокси работают должным образом, особенно если есть функциональная логика для получения и установки заголовков в прокси.
- Если вы по-прежнему не можете изменить свойство, обратитесь в службу поддержки Apigee Edge.
Отключение разрешений для заголовков
В этом разделе объясняется, как настроить свойство HTTPHeader.{Headername}
чтобы не допускать дублирования и нескольких значений для определенного заголовка HTTP в процессорах сообщений, используя соответствующий токен в соответствии с синтаксисом, описанным в разделе Как настроить Edge .
В этом разделе мы будем использовать Expires
(и myheader
) в качестве примера заголовка, для которого мы не хотим допускать дублирования, как описано ниже:
- Определите текущее значение свойства
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
Вывод приведенной выше команды приводит к одному из следующих результатов:
- Для свойства установлено пустое значение, что означает, что значение перезаписывается на NOT, чтобы допустить дублирование заголовков и несколько значений . То есть вам не разрешено отправлять заголовок
Expires
более одного раза как часть HTTP-запроса или HTTP-ответа в Apigee. - Для конкретного свойства нет совпадений, то это означает, что значение не перезаписывается и это заголовок NOT с уже существующей конфигурацией . Это означает, что конкретный заголовок может быть отправлен более одного раза (дубликаты допускаются) как часть HTTP-запроса или HTTP-ответа в Apigee Edge.
- Свойству присвоено значение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 не перезаписывается . - Для свойства установлено пустое значение, что означает, что значение перезаписывается на NOT, чтобы допустить дублирование заголовков и несколько значений . То есть вам не разрешено отправлять заголовок
- Если вы заметили одно из следующих явлений, выполните остальные действия, описанные в этом разделе:
- Свойство, соответствующее конкретному заголовку , перезаписывается, чтобы допустить дублирование и несколько значений, как в примере выходных данных № 1 выше (заголовок с уже существующей конфигурацией ).
- Нет совпадений для свойства, соответствующего конкретному заголовку, как в примере выходных данных № 2 выше (не заголовок с уже существующей конфигурацией ).
В противном случае пропустите остальные шаги этого раздела.
- Отредактируйте следующий файл. Если он не существует, вы можете его создать.
/opt/apigee/customer/application/message-processor.properties
Например, чтобы открыть файл с помощью vi , введите следующее:
vi /opt/apigee/customer/application/message-processor.properties
- Добавьте в файл свойств строку следующего формата:
Существующая конфигурация
Сценарий №1: Заголовок с уже существующей конфигурацией:
conf_http_HTTPHeader.Expires=
Нет ранее существовавшей конфигурации
Сценарий №2: Нет заголовка с уже существующей конфигурацией:
conf/http.properties+HTTPHeader.myheader=
- Сохраните изменения.
- Убедитесь, что файл свойств принадлежит пользователю
apigee
. Если это не так, выполните следующее:chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
- Перезапустите процессор сообщений:
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
Чтобы перезапустить без влияния на трафик, см. Последовательный перезапуск процессоров сообщений без влияния на трафик .
- Если у вас более одного процессора сообщений, повторите вышеуказанные шаги для всех процессоров сообщений.
Проверка того, что заголовок настроен так, чтобы не допускать дубликатов и нескольких значений.
В этом разделе объясняется, как проверить, что свойство HTTPHeader. HEADER_NAME
для определенного заголовка успешно обновлен, чтобы исключить дублирование в процессорах сообщений.
Мы будем использовать Expires
(и myheader
) в качестве примера заголовка и проверим, было ли обновлено соответствующее свойство HTTPHeader.Expires
(и HTTPHeader.myheader
).
На компьютере процессора сообщений найдите свойство
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
- Если новое значение заголовка HTTP успешно установлено для
HTTPHeader. HEADER_NAME
I в процессоре сообщений, затем приведенная выше команда показывает новое значение в файлеhttp.properties
. - Пример результата выполнения приведенной выше команды после
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=
- Обратите внимание, что в приведенном выше примере вывода свойству
HTTPHeader.Expires
(иHTTPHeader.myheader
) присвоено новое значение {blank}
вhttp.properties
. Это указывает на то, что поведение, разрешающее дубликаты и несколько значений для определенного HTTP-заголовкаExpires
(иmyheader
), успешно отключено в процессоре сообщений. Если вы по-прежнему видите старое значение свойства
HTTPHeader.Expires (or HTTPHeader.myheader)
, убедитесь, что вы правильно выполнили все шаги, описанные в разделе Настройка разрешенных дубликатов и нескольких значений для заголовков . Если вы пропустили какой-либо шаг, повторите все шаги еще раз правильно.Убедитесь, что ваши прокси работают должным образом, особенно если есть функциональная логика для получения и установки заголовков в прокси.
- Если вам по-прежнему не удается изменить свойство, обратитесь в службу поддержки Apigee Edge .