<ph type="x-smartling-placeholder"></ph>
現在、Apigee Edge のドキュメントが表示されています。
Apigee X のドキュメント。 詳細
症状
クライアント アプリケーションが HTTP ステータス コードと 400 Bad Request
エラーコードを取得する
protocol.http.DuplicateHeader
を API 呼び出しのレスポンスとして使用します。
エラー メッセージ
クライアント アプリケーションが次のレスポンス コードを受け取ります。
HTTP/1.1 400 Bad Request
また、次のようなエラー メッセージが表示される場合があります。
{ "fault":{ "faultstring":"Duplicate Header \"Expires\"", "detail":{ "errorcode":"protocol.http.DuplicateHeader" } } }
考えられる原因
このエラーは、Apigee で重複が許可されていない特定の HTTP ヘッダーがある場合に発生します。 によって送信された HTTP リクエストの一部と同じ値または異なる値で複数回出現 Apigee Edge に送信します。
<ph type="x-smartling-placeholder"></ph>によると
RFC 7230、セクション 3.2.2: Field Order、 送信者は複数のヘッダーを生成してはなりません
メッセージ内に同じフィールド名を持つフィールドがあっても、そのフィールド値全体が
ヘッダー フィールドはカンマ区切りのリストとして定義されています(例:#(values)] または header フィールド
既知の例外です。Apigee Edge が特定のヘッダーを検出した場合、そのヘッダーには
クライアントから送信された HTTP リクエスト で複数回重複があった場合、
400 Bad Request
とエラーコードを返す
protocol.http.DuplicateHeader
。
このエラーには、次の原因が考えられます。
原因 | 説明 | トラブルシューティングの実施対象 |
---|---|---|
リクエスト内のヘッダーが重複しています | クライアント アプリケーションから Apigee への HTTP リクエストに、重複するヘッダーが含まれています。 | Edge Public Cloud ユーザーと Edge Private Cloud ユーザー |
共通の診断手順
このエラーを診断するには、次のいずれかのツールまたは手法を使用します。
API Monitoring
<ph type="x-smartling-placeholder">
API Monitoring を使用してエラーを診断するには:
- <ph type="x-smartling-placeholder"></ph> Apigee Edge UI にログインします。 適切なロールが割り当てられます。
問題を調査する組織に切り替えます。
- [Analyze] >API モニタリング >Investigate ページをご覧ください。
- エラーが発生した期間を選択します。
- プロキシ フィルタが [すべて] に設定されていることを確認します。 <ph type="x-smartling-placeholder">
- 障害コードを Time に対してプロットします。
障害コードが
protocol.http.DuplicateHeader
であるセルを選択してください 次のように指定します。障害コード
<ph type="x-smartling-placeholder">protocol.http.DuplicateHeader
に関する情報は次のとおりです。 次のように表示されます。- [ログを表示] をクリックし、失敗したリクエストの行を開きます。
- [ログ] ウィンドウで、次の詳細をメモします。
<ph type="x-smartling-placeholder">
- </ph>
- ステータス コード:
400
- 障害の発生元:
apigee
- 障害コード:
protocol.http.DuplicateHeader
- ステータス コード:
- [Fault Source] の値が
apigee
またはMP
で、[Fault Code] の値がprotocol.http.DuplicateHeader
です。これは、送信元の HTTP リクエストが クライアントで重複したヘッダーが含まれていました。
Trace ツール
<ph type="x-smartling-placeholder">NGINX
<ph type="x-smartling-placeholder">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 で
400
エラーが見つかった場合protocol.http.DuplicateHeader
の値と一致する場合、 X-Apigee-fault-source. の値を確認します。NGINX アクセスログの 400 エラーの例:
NGINX アクセスログの上記のサンプル エントリには、X-Apigee- fault-code と X-Apigee-fault-source:
レスポンス ヘッダー 値 X-Apigee-fault-code protocol.http.DuplicateHeader
X-Apigee-fault-source MP
原因: リクエスト内のヘッダーが重複している
診断
- API を使用して、観測されたエラーの障害コードと障害ソースを特定します。 Monitoring または 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"
上のリクエスト例では、ヘッダー
<ph type="x-smartling-placeholder">Expires
が 1 回だけです。したがって、このリクエストは400 Bad Request
エラーで失敗し、 エラーコード:protocol.http.DuplicateHeader
- または、クライアント ログにアクセスできる場合は、 Apigee Edge に対して行われた実際のリクエストに関する情報が表示され、 複数回送信される可能性があります。
解決策
重複を修正する
オプション 1 [推奨オプション] 重複したヘッダーが含まれないようにクライアント アプリケーションを修正する
<ph type="x-smartling-placeholder">- 特定のクライアントが重複ヘッダーを送信する理由を分析します。たとえば
上記のケースでは
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 プロパティを使用する
<ph type="x-smartling-placeholder">Apigee では、
CwC プロパティ HTTPHeader.<HeaderName>
を使用すると、
重複するヘッダーを Apigee Edge の API プロキシに送信します。
CwC プロパティ | 値 |
---|---|
HTTPHeader.<HeaderName> |
allowDuplicates,multivalued |
たとえば、Message Processor で次のプロパティを設定して、重複と
ヘッダー Expires
に複数の値が設定されている。
HTTPHeader.Expires=allowDuplicates, multiValued
- Private Cloud ユーザーは、プロパティを構成して、
リクエストがあっても Apigee Edge が
400 Bad Request
エラーを発生させない を使用して重複したヘッダーが含まれている 重複ヘッダーを使用するように Message Processor を構成するの入門ガイドを参照してください。 - Public Cloud ユーザーの場合は、Apigee Edge サポートに連絡してこのプロパティの構成を依頼してください。 できます。
仕様
Apigee では、クライアント アプリケーションがリクエストの一部として重複するヘッダーを送信しないことを想定している が次の RFC 仕様に準拠しています。
仕様 |
---|
<ph type="x-smartling-placeholder"></ph> RFC 7230、セクション 3.2.2: Field Order |
<ph type="x-smartling-placeholder"></ph> 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