ここに表示されているのは Apigee Edge のドキュメントです。
Go to the
Apigee X のドキュメントに移動します。 info
症状
クライアント アプリケーションが、API 呼び出しに対するレスポンスとして、
エラーコード protocol.http.BadPath の 500 Internal Server Error という HTTP ステータス コードを受け取ります。
エラー メッセージ
クライアント アプリケーションは、次のレスポンス コードを受け取ります。
HTTP/1.1 500 Internal Server Error
さらに、次のエラー メッセージも確認できます。
{
"fault":{
"faultstring":"Invalid request path",
"detail":{
"errorcode":"protocol.http.BadPath"
}
}
}考えられる原因
このエラーは、フロー変数
target.urlで表されるバックエンド サーバーのリクエスト URL に、スラッシュ(/)の代わりに、疑問符(?)で始まるpath が含まれている場合に発生します。これは無効です。
仕様 RFC 3986、セクション 3: Syntax Components と RFC 3986、セクション 3.3: Pathに準拠しています。
URI 構文 には次のコンポーネントが含まれます。
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragmentpathコンポーネントは必須 であり、必ずスラッシュ(/)で始まる必要があります。
したがって、バックエンド サーバーのリクエスト URL の path コンポーネントがスラッシュ(/)ではなく疑問符(?)で始まる場合、Apigee Edge は 500 Internal Server Error とエラーコード protocol.http.BadPath で応答します。
たとえば、target.url の値が
https://www.mocktarget.apigee.net?json の場合、
path がスラッシュ(/)ではなく疑問符(?)で始まるため、無効 となり、このエラーが発生します。
| 原因 | 説明 | トラブルシューティングの実施対象 |
|---|---|---|
| バックエンド サーバーの URL(target.url)のパスが無効です | フロー変数
target.urlで表されるバックエンド サーバーの URL のパス コンポーネントが、スラッシュ(/)ではなく疑問符(?)で始まっています。 |
Edge Public Cloud と Private Cloud のユーザー |
共通の診断手順
このエラーを診断するには、次のいずれかのツールまたは手法を使用します。
API Monitoring
手順 1: API Monitoring を使用する
API Monitoring を使用してエラーを診断するには:
- 適切なロールを持つユーザーとして Apigee Edge UI にログインします。
問題を調査する組織に切り替えます。
- [分析] > [API Monitoring] > [調査] ページに移動します。
- エラーが発生した特定の期間を選択します。
[障害コード] を [時間] に対してプロットします。
次のように、障害コード
protocol.http.BadPathを含むセルを選択します 。
次のように、障害コード
protocol.http.BadPathに関する情報が 表示されます。
[ログを表示 ] をクリックして、失敗したリクエストの行を展開します。
- [ログ] ウィンドウで、次の詳細をメモします。
- ステータス コード:
500 - 障害ソース:
target - 障害コード:
protocol.http.BadPath
- ステータス コード:
- If the [Fault Source] is
targetand the [Fault Code] isprotocol.http.BadPath, then that indicates that the backend server URL has an invalid path.
トレース
手順 2: Trace ツールを使用する
Trace ツールを使用してエラーを診断するには:
- トレース セッションを有効にして、次のいずれかを行います。
500 Internal Server Errorエラーが発生するまで待つ。- 問題を再現できる場合は、API 呼び出しを行って問題を再現する
500 Internal Server Error
[Show all FlowInfos] が有効になっていることを確認します。

- 失敗したリクエストのいずれかを選択して、トレースを調べます。
- トレースのさまざまなフェーズを確認して、エラーが発生した場所を特定します。
通常、エラーは次のように [Target Request Flow Started ] フェーズの後のフローにあります。

トレースからエラーの値をメモします。
error: Invalid request path
エラーは [Target Request Flow Started] フェーズの後に Apigee Edge によって発生するため、バックエンド サーバーの URL の **パスが無効** であることを示します。これは、Apigee Edge のフロー変数
target.url(バックエンド サーバーの URL を表す)が、ターゲット リクエスト フローのいずれかのポリシーによって無効なパスで更新された場合に発生する可能性が最も高くなります。- エラーフローから [Target Request Flow Started] フェーズに向かって、各フローの [Variables Read and Assigned] セクションを調べます。
- フロー変数
target.urlが 更新されたポリシーを特定します。JavaScript ポリシーがフロー変数
target.url:を更新したことを示すトレースの例:
上記のトレース例では、フロー変数
target.urlの値がJS- SetTargetURLという名前の JavaScript ポリシーで次のように更新されています。target.url : https://mocktarget.apigee.net?json target.urlの値には次のコンポーネントが含まれています。- scheme:
https - authority:
mocktarget.apigee.net - path:
?json
- scheme:
- path コンポーネントがスラッシュ(
/)ではなく疑問符(?)で始まるため、エラーInvalid request pathが発生します。 - トレースの [AX](記録された分析データ)フェーズに移動してクリックします。
[Phase Details] - [Error Headers] セクションまでスクロールし、 次のように X-Apigee-fault-code と X-Apigee-fault-source の値を特定します。

X-Apigee-fault-code と X-Apigee-fault-source の値はそれぞれ
protocol.http.BadPathとtargetになります。これは、バックエンド サーバーの URL のパスが無効であるためにこのエラーが発生したことを示しています。レスポンス ヘッダー 値 X-Apigee-fault-code protocol.http.BadPathX-Apigee-fault-source target
NGINX
手順 3: NGINX アクセスログを使用する
NGINX アクセスログを使用してエラーを診断するには:
- Private Cloud ユーザーの場合は、NGINX アクセスログを使用して、HTTP
500 Internal Server Errorに関する重要な情報を特定できます。 NGINX アクセスログを確認します。
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log- 特定の期間(過去に問題が発生した場合)にエラーコード
protocol.http.BadPathの500エラーがあるかどうか、または500で失敗しているリクエストがまだあるかどうかを検索します。 X-Apigee-fault-code が値
protocol.http.BadPathと一致する500エラーが見つかった場合は、X- Apigee-fault-source の値を特定します。NGINX アクセスログからの 500 エラーの例:
NGINX アクセスログの上のサンプル エントリには、X-Apigee- fault-code と X-Apigee-fault-source: の次の値があります。
ヘッダー 値 X-Apigee-fault-code protocol.http.BadPathX-Apigee-fault-source targetX-Apigee-fault-code と X-Apigee-fault-source の値はそれぞれ
protocol.http.BadPathとtargetになります。これは、バックエンド サーバーの URL のパスが無効 であるためにこのエラーが発生したことを示しています。
原因: バックエンド サーバーの URL(target.url)のパスが無効です
診断
-
共通の診断手順で説明されているように、API Monitoring、Trace ツール、NGINX アクセスログを使用して、
500 Internal Server Errorの障害コード と障害ソース を特定します。 - 障害コード が
protocol.http.BadPathで、障害ソース の値がtargetの場合、バックエンド サーバーの URL のパスが無効 であることを示します。 バックエンド サーバーの URL は、Apigee Edge のフロー変数
target.urlで表されます。通常、このエラーは、ターゲット リクエスト フローのポリシー(プロキシ/共有フロー内)を使用して、バックエンド サーバーの URL (target.url)動的 に更新しようとしたときに、パスが無効 になる場合に発生します。次のいずれかの方法を使用して、フロー変数
target.urlに実際に無効な パス があるかどうかと、その値のソースを特定します。トレース
Trace ツールを使用する
このエラーのトレースをキャプチャした場合は、 Trace ツールを使用する で説明されている手順に沿って操作します。
target.urlのパスが無効かどうか、つまりスラッシュ(/)ではなく疑問符(?)で始まっているかどうかを確認します。はいの場合、無効なパスが含まれるように
target.urlの値を変更または更新したポリシーを見つけます。JavaScript ポリシーがフロー変数 を更新したことを示すトレースの例:
target.url
- 上記のトレース例では、JavaScript ポリシーが
target.urlの値を変更または更新して、無効なパスを含めていることがわかります。 target.urlには次のコンポーネントが含まれています。- scheme:
https - authority:
mocktarget.apigee.net - path:
?json
パスはスラッシュ(
/)ではなく疑問符(?)で始まっているため、 無効です。- scheme:
ログ
ログサーバーでログを使用する
- このエラーのトレースがない場合(断続的な問題)、
MessageLogging ポリシーや
ServiceCallout ポリシーなどのポリシーを使用して、フロー変数
target.urlの値に関する情報をログサーバーに記録しているかどうかを確認します。 - ログがある場合は、ログを確認して次のことを行います。
target.urlのパスが無効かどうかを確認します。- 無効なパスが含まれるように
target.urlを変更したポリシーに関する情報を特定できるかどうかを確認します。
API プロキシ
失敗した API プロキシを確認する
このエラーのトレースまたはログがない場合は、失敗した API プロキシを確認して、フロー変数
target.urlを変更または更新して 無効なパス を含めたものを特定します。以下をご確認ください。- API プロキシ内のポリシー
- プロキシから呼び出された共有フロー
フロー変数
target.urlを変更または更新する特定のポリシー(AssignMessage や JavaScript など)を慎重に調べて、target.urlを更新して 無効なパス を含める原因を特定します。フロー変数
target.urlを誤って更新して無効なパスを含め、このエラーを引き起こすポリシーの例をいくつか示します。サンプル 1
サンプル 1: JavaScript ポリシーが
target.url変数を更新するvar url = "https://mocktarget.apigee.net?json" context.setVariable("target.url", url);
上記のサンプルでは、フロー変数
target.urlが別の変数url.に含まれる値https://mocktarget.apigee.net?jsonで更新されています。urlの値には次のコンポーネントが含まれています。- scheme:
https - authority:
mocktarget.apigee.net - path:
?json
パスはスラッシュ(
/)ではなく疑問符(?)で始まっているため、, 無効です。そのため、Apigee Edge はエラーコードprotocol.http.BadPathで500 Internal Server Errorを返します。サンプル 2
サンプル 2: JavaScript ポリシーがリクエスト ヘッダーの値に基づいて
target.url変数 を更新するvar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
上記のサンプルでは、フロー変数
target.urlが、変数urlに含まれる値https://mocktarget.apigee.netと、request.header.Path.から取得された別の変数pathの値を連結して更新されています。実際のリクエストまたはトレースにアクセスできる場合は、渡された実際の値 を
request.header.Path確認できます。ユーザーが行ったリクエストの例
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: ?user"
この例では、ヘッダーパスはリクエストの一部として送信されません。そのため、JavaScript ポリシーの変数
pathの値はnullです。それによって次のようになります。
url = https://mocktarget.apigee.net + pathurl = https://mocktarget.apigee.net + "?user"target.url = https://mocktarget.apigee.net?user
target.urlの値には次のコンポーネントが含まれています。- scheme:
https - authority:
mocktarget.apigee.net - path:
?user
パスはスラッシュ (
/)ではなく疑問符(?)で始まっているため、無効です。そのため、Apigee Edge はエラーコードprotocol.http.BadPathで500 Internal Server Errorを返します。サンプル 3
サンプル 3: AssignMessage ポリシーが
target.url変数を更新する<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net?echo</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
urlの値には次のコンポーネントが含まれています。- scheme:
https - authority:
mocktarget.apigee.net - path:
?echo
この例でも、パスはスラッシュ(
/)ではなく疑問符(?) で始まっているため、無効です。そのため、Apigee Edge はエラーコードprotocol.http.BadPathで500 Internal Server Errorを返します。- scheme:
解決策
URL 仕様
RFC 3986、セクション 3: Syntax Components に準拠して、path コンポーネントは必須
であり、必ず「/」 で始まる必要があります。この問題を解決するには、次の手順を行います。
- フロー変数
target.urlで表されるバックエンド サーバーの URL に常に 有効なパス があり、必ず スラッシュ(/)で始まるようにします。- パスにリソース名がない場合は、パスに少なくともスラッシュ(
/)が含まれていることを確認します。 - 他の変数を使用してフロー変数
target.urlの値を決定する場合は、他の変数に 無効なパスが含まれていないことを確認します。 - 文字列操作を行ってフロー変数
target.urlの値を決定する場合は、文字列操作の結果に 無効なパス が含まれていないことを確認します。
- パスにリソース名がない場合は、パスに少なくともスラッシュ(
上記で説明したサンプルでは、次の方法でこの問題を解決できます。
サンプル 1
サンプル 1: JavaScript ポリシーが
target.url変数を更新する次の例に示すように、変数
urlで疑問符(?)の代わりにスラッシュ(/)を使用すると、この問題を解決できます。var url = "https://mocktarget.apigee.net/json" context.setVariable("target.url", url);
サンプル 2
サンプル 2: JavaScript ポリシーがリクエスト ヘッダーの値に基づいて
target.url変数 を更新するvar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
次の例に示すように、リクエスト ヘッダー
Pathの一部として有効なパス(/userなど)を渡して、この問題を解決します。リクエスト例:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /user"
サンプル 3
サンプル 3: AssignMessage ポリシーが
target.url変数を更新するAssignMessage ポリシーの
<Value>要素に有効なパスを追加します。 つまり、疑問符(?) をスラッシュ(/)に置き換え、<Value>要素でhttps://mocktarget.apigee.net/echoに設定して、次の例に示すようにこの問題を解決します。<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net/echo</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
仕様
Apigee Edge では、次の仕様に準拠して、バックエンド サーバーの URL の
pathコンポーネント は必ずスラッシュ(/) で始まる必要があります。仕様 RFC 3986、セクション 3: Syntax Components RFC 3986、セクション 3.3: Path Apigee サポートのサポートが必要な場合は、診断情報の収集が必要な場合をご覧ください。
診断情報の収集が必要な場合
上記の手順を行っても問題が解決しない場合は、次の 診断情報を収集してApigee Edge サポートにお問い合わせください。
Public Cloud ユーザーの場合は、次の情報を提供してください。
- 組織名
- 環境名
- API プロキシの名前
- エラーコード
protocol.http.BadPathで500 Internal Server Errorを再現するために使用した完全なcurlコマンド - API リクエストのトレース ファイル
Private Cloud ユーザーの場合は、次の情報を提供してください。
- 失敗したリクエストで確認されたエラー メッセージ全文
- 環境名
- API プロキシ バンドル
- 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
参照