Вы просматриваете документацию 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. Значение по умолчанию: |
|
| Это свойство используется для переопределения поведения конкретного заголовка по сравнению с тем, что указано в | То же самое, что и выше. |
Заголовки, в которых не допускается наличие дубликатов и множественных значений.
Как объяснялось ранее, Apigee Edge по умолчанию разрешает дублирование и множественные значения для большинства HTTP-заголовков. Это связано с тем, что свойство HTTPHeader. ANY настроено со значением multiValued, allowDuplicates.
Конфигурация перезаписана.
Для некоторых конкретных заголовков конфигурация по умолчанию перезаписывается одним из следующих способов:
HTTPHeader. HEADER_NAME =multiValued, allowDuplicatesДанная конфигурация не изменяет поведение по умолчанию . То есть, в конкретном заголовке допускается наличие дубликатов и множественных значений.
.HTTPHeader. HEADER_NAME =Эта конфигурация изменяет поведение по умолчанию . То есть, конкретный заголовок не может содержать дубликатов и множественных значений .
Определение заголовков, в которых не допускается наличие дубликатов и множественных значений.
В этом разделе описывается, как определить следующее:
- В настройках Apigee Edge Private Cloud не допускается наличие дубликатов и множественных значений в заголовках, а также
- Конкретные заголовки с уже существующей конфигурацией
На машине обработчика сообщений найдите свойство
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>
- Как пояснялось в разделе «Перезапись конфигурации» , обратите внимание на следующую информацию в приведенном выше примере выходных данных:
- HTTP-заголовок
Connectionперезаписывается, но допускается наличие дубликатов и множественных значений. - HTTP-заголовки
HostиExpiresперезаписываются и не допускают наличия дубликатов и множественных значений. - В заголовке HTTP
Dateпроисходит перезапись, допускается наличие дубликатов, но не допускается наличие нескольких значений. - Все заголовки, которые здесь отображаются (
Connection,Host,ExpiresиDateв приведенном выше примере), в этом документе называются заголовками с уже существующей конфигурацией .
- HTTP-заголовок
Поведение 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 | Внутри системы мы разделяем
и затем возникает ошибка | Внутри системы мы разделяем
но затем исходная форма отправляется в целевую систему. |
test‑header=atest‑header=b | protocol.http. | test‑header=atest‑header=b | protocol.http. | test‑header=atest‑header=b |
Прежде чем начать
Прежде чем выполнять действия, описанные в этом документе, убедитесь, что вы понимаете, как настраивать параметры Edge в частном облаке, как описано в разделе «Как настроить Edge» .
Настройка параметра allowDuplicates и нескольких значений для заголовков.
Как поясняется в разделе о свойствах 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.Expirestoken в обработчике сообщений:grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
Результатом выполнения указанной выше команды является один из следующих вариантов:
- Если для этого свойства установлено пустое значение, это означает, что значение перезаписывается (и это заголовок с уже существующей конфигурацией ), чтобы НЕ допускать дублирования заголовков и множественных значений. То есть, вам не разрешается отправлять заголовок
Expiresболее одного раза в рамках HTTP-запроса или HTTP-ответа в Apigee. - Если совпадений по конкретному свойству нет, это означает, что значение не перезаписывается (и это НЕ заголовок с уже существующей конфигурацией ). Это значит, что данный заголовок может быть отправлен более одного раза (допускаются дубликаты) в составе HTTP-запроса или HTTP-ответа в Apigee Edge.
- Если свойство установлено со значением
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было установлено с новым значениемallowDuplicates, multiValuedвhttp.properties. Это указывает на то, что поведение, разрешающее дубликаты и множественные значения вHTTPHeader, успешно настроено в обработчике сообщений. - Если вы по-прежнему видите старое значение свойства
HTTPHeader. HEADER_NAME, убедитесь, что вы правильно выполнили все шаги, описанные в разделе «Настройка разрешения дубликатов и множественных значений для заголовков» . Если вы пропустили какой-либо шаг, повторите все шаги заново.Убедитесь, что ваши прокси-серверы работают должным образом, особенно если в них реализована логика получения и установки заголовков.
- Если вам по-прежнему не удаётся изменить это свойство, обратитесь в службу поддержки Apigee Edge.
Отключение параметра allowDuplicates для заголовков
В этом разделе объясняется, как настроить свойство HTTPHeader.{Headername} чтобы предотвратить дублирование и множественные значения для определенного HTTP-заголовка в обработчиках сообщений, используя соответствующий токен в соответствии с синтаксисом, описанным в разделе «Как настроить Edge» .
В этом разделе мы будем использовать заголовок Expires (и myheader ) в качестве примера заголовка, для которого мы не хотим допускать дубликатов, как объяснено ниже:
- Чтобы убедиться, что параметр
HTTPHeader HEADER_NAMEеще не отключен для разрешения дубликатов и множественных значений, используйте следующую команду:grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
Например, если вы пытаетесь установить свойство заголовка
Expires, проверьте текущее значение свойстваHTTPHeader.Expirestoken в обработчике сообщений:grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
Результатом выполнения указанной выше команды является один из следующих вариантов:
- Если для этого свойства установлено пустое значение, это означает, что значение перезаписывается, чтобы не допускать дублирования заголовков и множественных значений . То есть, вам не разрешается отправлять заголовок
Expiresболее одного раза в рамках HTTP-запроса или HTTP-ответа в Apigee. - Если совпадений по конкретному свойству нет, это означает, что значение не перезаписывается , и это заголовок NOT с уже существующей конфигурацией . Это значит, что данный заголовок может быть отправлен более одного раза (допускаются дубликаты) в составе HTTP-запроса или HTTP-ответа в Apigee Edge.
- Если свойство установлено со значением
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. - Если для этого свойства установлено пустое значение, это означает, что значение перезаписывается, чтобы не допускать дублирования заголовков и множественных значений . То есть, вам не разрешается отправлять заголовок
- Если вы заметили один из следующих признаков, выполните остальные действия, описанные в этом разделе:
- Свойство, соответствующее конкретному заголовку, перезаписывается, чтобы разрешить дублирование и множественные значения, как в примере выходных данных №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_NAMEI в обработчике сообщений, то приведенная выше команда отобразит новое значение в файле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 .