Вы просматриваете документацию по 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: Порядок полей, как описано в следующих руководствах по устранению неполадок:
- 400 Bad Request - Duplicate Header (Ошибка 400: недопустимый запрос – повторяющийся заголовок)
- 502 Ошибка шлюза – дублирующийся заголовок
Однако в некоторых случаях может потребоваться добавить исключение, чтобы включить дубликаты и несколько значений для некоторых заголовков HTTP. В таких случаях можно разрешить дублирование заголовков и указать несколько значений для определенного заголовка HTTP, задав свойство HTTPHeader.HEADER_NAME на уровне Message Processor.
В этом документе приведена информация об этом свойстве, объясняется, как его включить, чтобы избежать упомянутых выше ошибок, и рассказывается о рекомендациях по его использованию.
Свойства заголовков 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, и
- Заголовки с pre-existing config
На компьютере 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>
- Как описано в разделе Конфигурация перезаписана, обратите внимание на следующую информацию в приведенном выше примере выходных данных:
- 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 | multiValued | allowDuplicates, multiValued (по умолчанию) | |
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) в качестве примера заголовка, для которого мы хотим разрешить дубликаты и несколько значений, как описано ниже:
-
Определите текущее значение свойства
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
В результате выполнения команды вы получите один из следующих результатов:
- Если для свойства задано пустое значение, это означает, что значение перезаписано (и это заголовок с ранее существовавшей конфигурацией), чтобы запретить дублирование заголовков и использование нескольких значений. То есть вы не можете отправить заголовок
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
Перезапустите Message Processor:
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
Чтобы перезапустить процессор сообщений без влияния на трафик, ознакомьтесь с разделом Поэтапная перезагрузка процессоров сообщений без влияния на трафик.
- Если у вас несколько процессоров сообщений, повторите описанные выше действия для каждого из них.
Проверка того, что заголовок настроен на наличие дубликатов и нескольких значений
В этом разделе рассказывается, как проверить, что свойство HTTPHeader.HEADER_NAME для определенного заголовка было успешно обновлено, чтобы разрешить дублирование в процессорах сообщений.
Мы будем использовать заголовок Expires и проверим, обновлено ли соответствующее свойство HTTPHeader.Expires.
Даже если вы используете токен conf_http_HTTPHeader.Expires, чтобы обновить значение в Message Processor, вам нужно проверить, было ли новое значение задано для свойства HTTPHeader.Expires.
- На компьютере 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
- Если новое значение успешно задано для
HTTPHeader.HEADER_NAMEв Message Processor, то указанная выше команда покажет новое значение в файлеhttp.properties. Пример результата выполнения команды после настройки
allowDuplicatesиmultiValued:/opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
- В приведенном выше примере обратите внимание, что свойству
HTTPHeader.Expiresзадано новое значениеallowDuplicates, multiValuedвhttp.properties. Это означает, что на Message Processor успешно настроено поведение, позволяющее использовать дубликаты и несколько значений вHTTPHeader. - Если вы по-прежнему видите старое значение свойства
HTTPHeader.HEADER_NAME, убедитесь, что вы правильно выполнили все шаги, описанные в разделе Настройка allowDuplicates и нескольких значений для заголовков. Если вы пропустили какой-либо шаг, повторите все действия заново.Убедитесь, что прокси-серверы работают правильно, особенно если в них реализована логика получения и установки заголовков.
- Если вам по-прежнему не удается изменить свойство, обратитесь в службу поддержки Apigee Edge.
Отключение allowDuplicates для заголовков
В этом разделе рассказывается, как настроить свойство HTTPHeader.{Headername}, чтобы запретить дубликаты и несколько значений для определенного заголовка HTTP в процессорах сообщений, используя соответствующий токен согласно синтаксису, описанному в статье Как настроить Edge.
В этом разделе мы будем использовать заголовок Expires (и myheader) в качестве примера заголовка, для которого мы не хотим разрешать дублирование, как описано ниже.
-
Определите текущее значение свойства
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
В результате выполнения команды вы получите один из следующих результатов:
- Если для свойства задано пустое значение, это означает, что значение iперезаписывается на NOT, чтобы разрешить дублирующиеся заголовки и несколько значений. То есть вы не можете отправлять заголовок
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. - Если для свойства задано пустое значение, это означает, что значение iперезаписывается на 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
- Перезапустите Message Processor:
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
Чтобы перезапустить процессор сообщений без влияния на трафик, ознакомьтесь с разделом Поэтапная перезагрузка процессоров сообщений без влияния на трафик.
- Если у вас несколько процессоров сообщений, повторите описанные выше действия для каждого из них.
Проверка заголовка настроена так, чтобы не допускать дубликатов и нескольких значений
В этом разделе рассказывается, как проверить, что свойство HTTPHeader.HEADER_NAME для определенного заголовка было успешно обновлено и не позволяет создавать дубликаты в процессорах сообщений.
Мы будем использовать заголовок Expires (и myheader) в качестве примера и проверим, обновилось ли соответствующее свойство HTTPHeader.Expires (и HTTPHeader.myheader).
На компьютере 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
- Если новое значение заголовка HTTP успешно задано для
HTTPHeader.HEADER_NAMEI в Message Processor, то в файле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. Это означает, что поведение, позволяющее дублировать и использовать несколько значений для определенного заголовка HTTPExpires(иmyheader), успешно отключено в Message Processor. Если вы по-прежнему видите старое значение свойства
HTTPHeader.Expires (or HTTPHeader.myheader), убедитесь, что вы правильно выполнили все шаги, описанные в разделе Настройка allowDuplicates и нескольких значений для заголовков. Если вы пропустили какой-либо шаг, повторите все действия заново.Убедитесь, что прокси-серверы работают правильно, особенно если в них реализована логика получения и установки заголовков.
- Если вам по-прежнему не удается изменить свойство, обратитесь в службу поддержки Apigee Edge.