ここに表示されているのは Apigee Edge のドキュメントです。
Go to the
Apigee X のドキュメントに移動します。 info
症状
クライアント アプリケーションが、API 呼び出しに対するレスポンスとしてエラーコード
protocol.http.DuplicateHeader 付きの HTTP ステータス コード 400 Bad Request を受け取ります。
エラー メッセージ
クライアント アプリケーションは、次のレスポンス コードを受け取ります。
HTTP/1.1 400 Bad Request
また、次のようなエラー メッセージが表示されます。
{
"fault":{
"faultstring":"Duplicate Header \"Expires\"",
"detail":{
"errorcode":"protocol.http.DuplicateHeader"
}
}
}考えられる原因
このエラーは、Apigee Edge で重複が許可されていない特定の HTTP ヘッダーが、クライアントから Apigee Edge に送信される HTTP リクエストの一部として同じ値または異なる値で複数回表示される場合に発生します。
RFC 7230、セクション 3.2.2: Field Orderに従って 、ヘッダー フィールドのフィールド値全体がカンマ区切りのリスト(#(values))として定義されている場合、またはヘッダー フィールドが
既知の例外である場合を除き、送信者はメッセージ内で同じフィールド名を持つ複数のヘッダー フィールドを生成してはなりません。Apigee Edge は、クライアントから送信されたHTTP リクエスト で、重複が許可されていない特定のヘッダーが複数回検出されると、400 Bad Request とエラーコードprotocol.http.DuplicateHeader を返します。
このエラーの原因として考えられるのは次のとおりです。
| 原因 | 説明 | トラブルシューティングの実施対象 |
|---|---|---|
| リクエスト内のヘッダーが重複している | クライアント アプリケーションから Apigee への HTTP リクエストに重複するヘッダーが含まれています。 | Edge Public Cloud ユーザーと Private Cloud ユーザー |
共通の診断手順
このエラーを診断するには、次のいずれかのツールまたは手法を使用します。
API Monitoring
API Monitoring を使用してエラーを診断するには:
- 適切なロールを持つユーザーとして Apigee Edge UIにログインします。
問題を調査する組織に切り替えます。

- [分析] > [API Monitoring] > [調査] ページに移動します。
- エラーが発生した特定の期間を選択します。
- プロキシ フィルタが [すべて] に設定されていることを確認します。
- [障害コード] を [時間] に対してプロットします。
次のように、障害コード
protocol.http.DuplicateHeaderを含むセルを選択します。
障害コード
protocol.http.DuplicateHeaderに関する情報が 表示されます。
- [ログを表示] をクリックして、失敗したリクエストの行を展開します。
- [ログ] ウィンドウで、次の詳細を確認します。
- ステータス コード:
400 - 障害ソース:
apigee - 障害コード:
protocol.http.DuplicateHeader。
- ステータス コード:
- 障害ソース の値が
apigeeまたはMPで、障害コード の値がprotocol.http.DuplicateHeaderの場合、クライアントからの HTTP リクエストに重複するヘッダーが含まれていることを示します。
Trace ツール
NGINX
NGINX アクセスログを使用してエラーを診断するには:
- Private Cloud ユーザーの場合は、NGINX アクセスログを使用して、HTTP
400エラーに関する重要な情報を確認できます。 NGINX アクセスログを確認します。
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logここで: ORG、ENV、PORT# は 実際の値に置き換えてください。
- 特定の期間に
400エラーが発生したかどうか(過去に問題が発生した場合)、または400で失敗しているリクエストがあるかどうかを確認します。 X-Apigee-fault-code が
protocol.http.DuplicateHeaderの値と一致する400エラーが見つかった場合は、X-Apigee-fault-source の値を特定します。NGINX アクセスログからの 400 エラーのサンプル:
NGINX アクセスログの上記のサンプル エントリには、X-Apigee- fault-code と X-Apigee-fault-source: の次の値が含まれています。
レスポンス ヘッダー 値 X-Apigee-fault-code protocol.http.DuplicateHeaderX-Apigee-fault-source MP
原因: リクエスト内のヘッダーが重複している
診断
- 共通の診断手順で説明されているように、API Monitoring または NGINX アクセスログを使用して、確認されたエラーの障害コード と障害ソース を特定します。
- 障害ソース の値が
apigeeまたはMPの場合、クライアント アプリケーションから Apigee に送信されたリクエストに重複するヘッダーが含まれていることを示します。 リクエストの一部として複数回送信される実際のヘッダーは、 次のいずれかの方法で特定できます。
エラー メッセージ
エラー メッセージを使用する
Apigee Edge から受信した完全なエラー メッセージにアクセスできる場合は、
faultstringを参照してください。faultstringには、複数回送信されたヘッダー名が含まれています。エラー メッセージの例:
"faultstring":"Duplicate Header \"Expires\""
- 上記のエラー メッセージでは、
faultstringに示されているように、ヘッダーExpiresが複数回送信されています。
実際のリクエスト
実際のリクエストを使用する
クライアント アプリケーションによって行われた実際のリクエストにアクセスできる場合は、 次の手順を行います。
- リクエストで渡されたヘッダーのリストを確認します。
- 特定の値または異なる値で、特定のリクエストが複数回表示されている場合、このエラーの原因となります。
リクエストのサンプル:
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が同じ値で 2 回送信されていますが、これは望ましくありません。この問題を解決するには、次のようにExpiresヘッダーを 1 回だけ渡します。curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
- 望ましく、重複するヘッダーを許可する場合は、 オプション 2: CwC プロパティを使用するに移動します。
CwC
オプション 2: CwC プロパティを使用する
Apigee には、クライアント アプリケーションとターゲット サーバーが重複するヘッダーを Apigee Edge の API プロキシに送信できるようにする
CwC プロパティ HTTPHeader.<HeaderName> が用意されています。
| CwC プロパティ | 値 |
|---|---|
HTTPHeader.<HeaderName> |
allowDuplicates,multivalued |
たとえば、次のプロパティを Message Processor に設定して、ヘッダー Expires の重複と
複数の値を許可できます。
HTTPHeader.Expires=allowDuplicates, multiValued
- プライベート クラウド ユーザーの場合は、重複するヘッダーを使用するように Message Processor を構成する
入門ガイドを使用して、リクエストに重複するヘッダーが含まれていても、Apigee Edge が
400 Bad Requestエラーを発生させないようにプロパティを構成できます。 - Public Cloud ユーザーの場合は、Apigee Edge サポートに連絡して、組織のこのプロパティ を構成してください。
仕様
Apigee では、クライアント アプリケーションが次の RFC 仕様に従って、リクエストの一部として重複するヘッダーを送信しないことを想定しています。
| 仕様 |
|---|
| RFC 7230、セクション 3.2.2: Field Order |
| RFC 7230、セクション 3.2: Header Fields |
Apigee サポートのサポートが必要な場合は、 診断情報の収集が必要な場合をご覧ください。
診断情報の収集が必要な場合
次の診断情報を収集して、Apigee Edge サポートにお問い合わせください。
Public Cloud ユーザーの場合は、次の情報を提供してください。
- 組織名
- 環境名
- API プロキシ名
400エラーを再現するために使用した完全なcurlコマンド- API リクエストのトレースファイル
Private Cloud ユーザーの場合は、次の情報を提供してください。
- 失敗したリクエストで確認された完全なエラー メッセージ
- 環境名
- API プロキシ バンドル
400エラーを再現するために使用した完全なcurlコマンド- API リクエストのトレースファイル
NGINX アクセスログ:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logここで: ORG、ENV、PORT# は実際の値に置き換えてください。
- Message Processor システムログ
/opt/apigee/var/log/edge-message-processor/logs/system.log