Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X. Информация
Symptom
Клиентское приложение получает код статуса HTTP 400 Bad Request с кодом ошибки protocol.http.DuplicateHeader в качестве ответа на вызовы API.
Сообщение об ошибке
Клиентское приложение получает следующий код ответа:
HTTP/1.1 400 Bad Request
Кроме того, вы можете увидеть сообщение об ошибке, похожее на приведенное ниже:
{
"fault":{
"faultstring":"Duplicate Header \"Expires\"",
"detail":{
"errorcode":"protocol.http.DuplicateHeader"
}
}
}Возможные причины
Эта ошибка возникает, если определенный заголовок HTTP, который не должен дублироваться в Apigee Edge, появляется более одного раза с одинаковыми или разными значениями в HTTP-запросе, отправленном клиентом в Apigee Edge.
Согласно
RFC 7230, раздел 3.2.2: Порядок полей, отправитель НЕ ДОЛЖЕН создавать несколько полей заголовка с одним и тем же именем поля в сообщении, если только все значение поля заголовка не определено как список, разделенный запятыми, [т.е. #(values)] или поле заголовка является известным исключением. Если Apigee Edge обнаружит, что определенный заголовок, который не должен дублироваться, встречается в HTTP-запросе , отправленном клиентом, более одного раза, то он ответит кодом 400 Bad Request и кодом ошибки protocol.http.DuplicateHeader.
Вот возможные причины этой ошибки:
| Причина | Описание | Инструкции по устранению неполадок, применимые к |
|---|---|---|
| Повторяющийся заголовок в запросе | HTTP-запрос от клиентского приложения к Apigee содержит повторяющиеся заголовки. | Пользователи общедоступного и частного облака Edge |
Распространенные этапы диагностики
Чтобы диагностировать эту ошибку, используйте один из следующих инструментов или методов:
Мониторинг API
Чтобы диагностировать ошибку с помощью мониторинга API:
- Войдите в интерфейс Apigee Edge как пользователь с подходящей ролью.
Перейдите к организации, в которой хотите изучить проблему.

- Перейдите на страницу Анализ > Мониторинг API > Исследование.
- Выберите период времени, в течение которого вы наблюдали ошибки.
- Убедитесь, что для фильтра прокси-сервера задано значение Все.
- Постройте график Код ошибки по оси Y и Время по оси X.
Выберите ячейку с кодом ошибки
protocol.http.DuplicateHeader, как показано ниже.
Информация о коде ошибки
protocol.http.DuplicateHeaderбудет показана, как на изображении ниже:
- Нажмите Посмотреть журналы и разверните строку с неудачным запросом.
- В окне Журналы обратите внимание на следующие сведения:
- Код статуса:
400. - Источник ошибки:
apigee - Код ошибки:
protocol.http.DuplicateHeader.
- Код статуса:
- Если в поле Источник ошибки указано значение
apigeeилиMP, а в поле Код ошибки –protocol.http.DuplicateHeader, это означает, что HTTP-запрос от клиента содержал дублирующиеся заголовки.
Инструмент "Трассировка"
nginx
Чтобы диагностировать ошибку с помощью журналов доступа NGINX:
- Если вы используете частное облако, то можете использовать журналы доступа NGINX, чтобы определить ключевую информацию об ошибках HTTP
400. Проверьте журналы доступа NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logГде: ORG, ENV и PORT# заменяются фактическими значениями.
- Выполните поиск, чтобы узнать, возникали ли ошибки
400за определенный период времени (если проблема возникла в прошлом) или есть ли запросы, которые по-прежнему завершаются с ошибкой400. Если вы обнаружите ошибки
400с кодом X-Apigee-fault-code, соответствующим значениюprotocol.http.DuplicateHeader, определите значение X-Apigee-fault-source.Пример ошибки 400 из журнала доступа NGINX
В приведенной выше записи из журнала доступа NGINX для атрибутов X-Apigee-fault-code и X-Apigee-fault-source заданы следующие значения:
Заголовки ответов Значение X-Apigee-fault-code protocol.http.DuplicateHeaderX-Apigee-fault-source MP
Причина: в запросе дублируется заголовок
диагностика;
- Определите код ошибки и источник ошибки, используя мониторинг API или журналы доступа NGINX, как описано в разделе Распространенные действия по диагностике.
- Если в поле Fault Source указано значение
apigeeилиMP, это означает, что запрос, отправленный клиентским приложением в Apigee, содержит дублирующиеся заголовки. Определить, какой именно заголовок отправляется несколько раз в составе запроса, можно одним из следующих способов:
Сообщение об ошибке
Как использовать сообщение об ошибке
Если у вас есть доступ к полному сообщению об ошибке, полученному от Apigee Edge, ознакомьтесь с разделом
faultstring. Вfaultstringуказано название заголовка, который был отправлен более одного раза.Пример сообщения об ошибке
"faultstring":"Duplicate Header \"Expires\""
- В приведенном выше сообщении об ошибке видно, что заголовок
Expiresотправлен несколько раз, как указано вfaultstring.
Фактический запрос
Используя фактический запрос
Если у вас есть доступ к фактическому запросу, отправленному клиентским приложением, выполните следующие действия:
- Проверьте список заголовков, переданных в запросе.
- Если вы обнаружите, что определенный заголовок появляется в запросе более одного раза с одним и тем же или разными значениями, то это и будет причиной ошибки.
Образец запроса:
curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT" -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
В приведенном выше примере запроса заголовок
Expiresотправляется более одного раза. Поэтому запрос завершается с ошибкой400 Bad Requestи кодом ошибкиprotocol.http.DuplicateHeader.- Если у вас есть доступ к журналам клиента, вы можете посмотреть, есть ли в них информация о фактическом запросе, отправленном в Apigee Edge, и определить заголовок, который отправляется более одного раза.
Разрешение
Как устранить дублирование
Вариант 1 (рекомендуется). Исправьте клиентское приложение, чтобы оно не включало повторяющиеся заголовки.
- Проанализируйте, почему определенный клиент отправляет дублирующиеся заголовки. Например, в приведенном выше случае это
Expires. Убедитесь, что прокси API могут принимать дублирующиеся заголовки. Как правило, это нежелательно согласно спецификации HTTP RFC7230. - Если это нежелательно, измените клиентское приложение, чтобы оно не отправляло дублирующиеся заголовки.
В приведенном выше примере заголовок
Expiresотправляется дважды с одним и тем же значением, что нежелательно. Чтобы устранить проблему, передайте заголовокExpiresтолько один раз, как показано ниже:curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
- Если вы хотите разрешить дублирование заголовков, перейдите к разделу Вариант 2. Использование свойства CwC.
CwC
Вариант 2. Использование ресурса "Конверсии в магазинах"
Apigee предоставляет свойство
CwC HTTPHeader.<HeaderName> ,которое позволяет клиентским приложениям и целевым серверам отправлять дублирующиеся заголовки прокси API в Apigee Edge.
| Ресурс CwC | Значения |
|---|---|
HTTPHeader.<HeaderName> |
allowDuplicates,multivalued |
Например, следующее свойство можно задать для обработчиков сообщений, чтобы разрешить дубликаты и несколько значений для заголовка Expires.
HTTPHeader.Expires=allowDuplicates, multiValued
- Если вы пользователь частного облака, вы можете настроить свойство, чтобы Apigee Edge не выдавал ошибку
400 Bad Request, даже если запрос содержит повторяющиеся заголовки. Инструкции приведены в практическом руководстве Настройка процессоров сообщений для использования повторяющихся заголовков. - Если вы пользователь общедоступного облака, обратитесь в службу поддержки Apigee Edge, чтобы настроить это свойство для вашей организации.
Спецификация
Apigee ожидает, что клиентское приложение не будет отправлять дублирующиеся заголовки в составе запроса в соответствии со следующими спецификациями RFC:
| Спецификация |
|---|
| RFC 7230, раздел 3.2.2: порядок полей |
| RFC 7230, раздел 3.2 "Поля заголовка" |
Если вам по-прежнему нужна помощь службы поддержки Apigee, перейдите к разделу Сбор диагностической информации.
Необходимо собрать диагностическую информацию
Соберите указанную ниже диагностическую информацию и обратитесь в службу поддержки Apigee Edge.
Если вы пользователь общедоступного облака, предоставьте следующую информацию:
- Название организации
- Название среды
- Название прокси API
- Команда
curl, использованная для воспроизведения ошибки400 - Файл трассировки для запросов к API
Если вы используете частное облако, предоставьте следующую информацию:
- Полное сообщение об ошибке, которое появляется при неудачных запросах.
- Название среды
- Пакет прокси-сервера API
- Полная команда
curl, которую вы использовали для воспроизведения ошибки400 - Файл трассировки для запросов к API
Журналы доступа NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logГде: ORG, ENV и PORT# заменяются фактическими значениями.
- Системные журналы обработчика сообщений
/opt/apigee/var/log/edge-message-processor/logs/system.log