현재 Apigee Edge 문서가 표시되고 있습니다.
Apigee X 문서로 이동 정보
증상
클라이언트 애플리케이션은 HTTP 상태 코드 500 Internal Server Error
와 함께 오류 코드 protocol.http.BadPath
를 API 호출에 대한 응답으로 가져옵니다.
오류 메시지
클라이언트 애플리케이션은 다음 응답 코드를 가져옵니다.
HTTP/1.1 500 Internal Server Error
또한 다음과 같은 오류 메시지가 표시될 수 있습니다.
{ "fault":{ "faultstring":"Invalid request path", "detail":{ "errorcode":"protocol.http.BadPath" } } }
가능한 원인
이 오류는 흐름 변수 target.url
로 표시되는 백엔드 서버의 요청 URL에 잘못된 슬래시 (/
) 대신 물음표 (?
)로 시작하는 path
이 포함된 경우에 발생합니다.
RFC 3986, 섹션 3: 구문 구성요소 및 RFC 3986, 섹션 3.3: 경로 사양에 따릅니다.
URI 구문 에는 다음과 같은 구성요소가 있습니다.
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment
path
구성요소는 필수이며 항상 슬래시(/
)로 시작하고 항상 슬래시(/
)를 포함해야 합니다(MUST).
따라서 백엔드 서버의 요청 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 퍼블릭 및 프라이빗 클라우드 사용자 |
일반적인 진단 단계
다음 도구/기술 중 하나를 사용하여 이 오류를 진단하세요.
API 모니터링
절차 #1: API 모니터링 사용
API 모니터링을 사용하여 오류를 진단하려면 다음 안내를 따르세요.
- 적절한 역할이 있는 사용자로 Apigee Edge UI에 로그인합니다.
문제를 조사하려는 조직으로 전환합니다.
- 분석 > API 모니터링 > 조사 페이지로 이동합니다.
- 오류를 관찰한 특정 기간을 선택합니다.
시간을 기준으로 결함 코드를 표시합니다.
아래와 같이 오류 코드가
protocol.http.BadPath
인 셀을 선택합니다.오류 코드
protocol.http.BadPath
에 관한 정보가 아래와 같이 표시됩니다.로그 보기 를 클릭하고 실패한 요청이 있는 행을 펼칩니다.
- 로그 창에서 다음 세부정보를 확인합니다.
- 상태 코드:
500
- 결함 소스:
target
- 오류 코드:
protocol.http.BadPath
- 상태 코드:
- 오류 소스가
target
이고 오류 코드가protocol.http.BadPath
이면 백엔드 서버 URL에 잘못된 경로가 있음을 나타냅니다.
Trace
절차 #2: Trace 도구 사용
Trace 도구를 사용하여 오류를 진단하려면 다음 단계를 따르세요.
- 트레이스 세션을 사용 설정하고 다음 중 하나를 사용 설정합니다.
500 Internal Server Error
오류가 발생할 때까지 기다립니다.- 문제를 재현할 수 있는 경우 API를 호출하여 문제를 재현합니다.
500 Internal Server Error
Show all FlowInfos(모든 FlowInfos 표시)가 사용 설정되어 있는지 확인합니다.
- 실패한 요청 중 하나를 선택하고 트레이스를 검사합니다.
- trace의 여러 단계를 살펴보고 실패가 발생한 위치를 찾습니다.
일반적으로 아래와 같이 대상 요청 흐름 시작 단계 이후의 흐름에서 오류를 찾을 수 있습니다.
트레이스에서 오류 값을 기록해 둡니다.
error: 잘못된 요청 경로
대상 요청 흐름 시작 단계 후에 Apigee Edge에서 오류를 발생시키므로 백엔드 서버 URL에 잘못된 경로가 있음을 나타냅니다. Apigee Edge에 있는 흐름 변수
target.url
(백엔드 서버의 URL을 나타냄)가 대상 요청 흐름의 정책 중 하나를 통해 잘못된 경로로 업데이트된 경우 이러한 상황이 발생할 가능성이 높습니다.- 각 흐름에서 오류 흐름에서 Target Request Flow Started(대상 요청 흐름 시작됨) 단계로 역순으로 변수 읽기 및 할당됨 섹션을 확인합니다.
- 흐름 변수
target.url
가 업데이트된 정책을 결정합니다.JavaScript 정책이 업데이트된 흐름 변수
target.url:
를 보여주는 샘플 트레이스위에 표시된 샘플 트레이스에서 흐름 변수 변수
target.url
의 값이 다음과 같이JS- SetTargetURL
라는 JavaScript 정책에서 업데이트됩니다.target.url : https://mocktarget.apigee.net?json
target.url
의 값에는 다음 구성요소가 포함됩니다.- 스키마:
https
- 권한:
mocktarget.apigee.net
- 경로:
?json
- 스키마:
- path 구성요소는 슬래시 (
/
) 대신 물음표 (?
)로 시작하므로Invalid request path
오류가 발생합니다. - 추적에서 AX (애널리틱스 데이터 기록됨) 단계로 이동하여 클릭합니다.
단계 세부정보 - 오류 헤더 섹션까지 아래로 스크롤하고 아래와 같이 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.BadPath
X-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 값과 일치하는 X-Apigee-fault-code 가 포함된
500
오류가 있는 경우 X-Apigee-fault-code 의 값을 확인합니다.NGINX 액세스 로그의 샘플 500 오류:
NGINX 액세스 로그의 위 샘플 항목에는 X-Apigee-fault-code 및 X-Apigee-fault-source에 대한 값이 다음과 같습니다.
헤더 값 X-Apigee-fault-code protocol.http.BadPath
X-Apigee-fault-source target
X-Apigee-fault-code 및 X-Apigee-fault-source의 값은 각각
protocol.http.BadPath
및target
입니다. 이는 백엔드 서버 URL에 잘못된 경로가 있기 때문에 이 오류가 발생했음을 나타냅니다.
원인: 백엔드 서버 URL (target.url)에 잘못된 경로가 있습니다.
진단
- 일반적인 진단 단계에 설명된 대로 API 모니터링, Trace 도구 또는 NGINX 액세스 로그를 사용하여
500 Internal Server Error
의 결함 코드 및 오류 소스를 확인합니다. - 오류 코드가
protocol.http.BadPath
이고 오류 소스 값이target
이면 백엔드 서버 URL에 잘못된 경로가 있음을 나타냅니다. 백엔드 서버 URL은 Apigee Edge에서 흐름 변수
target.url
로 표시됩니다. 이 오류는 일반적으로 대상 요청 흐름의 프록시/공유 흐름 내 정책을 사용하여 백엔드 서버 URL(target.url
)을 동적으로 업데이트하려고 하면 잘못된 경로가 포함된 경우에 발생합니다.다음 방법 중 하나를 사용하여 흐름 변수
target.url
에 잘못된 경로가 있는지, 값의 소스가 있는지 확인합니다.Trace
Trace 도구 사용
이 오류에 대한 trace를 캡처한 경우 trace 도구 사용 에 설명된 단계를 따르고
target.url
에 잘못된 경로, 즉 슬래시 (/
) 대신 물음표 (?
)로 시작하는지 확인합니다.올바르면 잘못된 경로를 포함하도록
target.url
값을 수정하거나 업데이트한 정책을 찾습니다.JavaScript 정책이 업데이트된 흐름 변수
target.url
를 보여주는 샘플 트레이스- 위의 샘플 트레이스에서 JavaScript 정책이 잘못된 경로를 포함하도록
target.url
값을 수정하거나 업데이트했습니다. target.url
에는 다음과 같은 구성요소가 있습니다.- 스키마:
https
- 권한:
mocktarget.apigee.net
- 경로:
?json
경로가 슬래시 (
/
) 대신 물음표 (?
)로 시작되므로 유효하지 않습니다.- 스키마:
로그
로그 서버에서 로그 사용
- 이 오류에 대한 트레이스가 없는 경우 (간헐적 문제)
MessageLogging 또는
Service콜아웃 정책과 같은 정책을 사용하여 로그 서버에 흐름 변수
target.url
의 값에 대한 정보를 로깅했는지 확인하세요. - 로그가 있으면 검토합니다.
target.url
에 잘못된 경로가 있는지 확인target.url
에 잘못된 경로가 포함되도록 수정한 정책 정보를 확인할 수 있는지 확인
API 프록시
실패한 API 프록시 검토
이 오류에 대한 트레이스나 로그가 없으면 실패한 API 프록시를 검토하여 잘못된 경로를 포함하도록 흐름 변수
target.url
를 수정하거나 업데이트한 항목을 확인합니다. 다음을 확인하세요.- API 프록시 내 정책
- 프록시에서 호출된 모든 공유 흐름
흐름 변수
target.url
를 수정하거나 업데이트하는 특정 정책 (예: AssignMessage 또는 자바스크립트)을 자세히 살펴보고target.url
를 업데이트하는 이유에 잘못된 경로가 있는지 확인합니다.다음은 이 오류를 일으키는 잘못된 경로를 포함하도록
target.url
흐름 변수를 잘못 업데이트하는 정책의 몇 가지 예입니다.샘플 #1
샘플 #1:
target.url
변수를 업데이트하는 JavaScript 정책var url = "https://mocktarget.apigee.net?json" context.setVariable("target.url", url);
위 샘플에서 흐름 변수
target.url
는 다른 변수url.
에 포함된https://mocktarget.apigee.net?json
값으로 업데이트됩니다.url
의 값에는 다음과 같은 구성요소가 있습니다.- 스키마:
https
- 권한:
mocktarget.apigee.net
- 경로:
?json
경로가 잘못된 슬래시 (
/
)가 아닌 물음표(?
)로 시작합니다. 따라서 Apigee Edge는 오류 코드protocol.http.BadPath
와 함께500 Internal Server Error
을 반환합니다.샘플 #2
샘플 #2: 요청 헤더의 값에 따라
target.url
변수를 업데이트하는 JavaScript 정책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"
이 예에서 헤더 경로는 요청의 일부로 전송되지 않습니다. 따라서 자바스크립트 정책에서
path
변수의 값은null
입니다.따라서
url = https://mocktarget.apigee.net + path
url = https://mocktarget.apigee.net + "?user"
target.url = https://mocktarget.apigee.net?user
target.url
의 값에는 다음과 같은 구성요소가 있습니다.- 스키마:
https
- 권한:
mocktarget.apigee.net
- 경로:
?user
경로가 잘못된 슬래시 (
/
)가 아닌 물음표(?
)로 시작합니다. 따라서 Apigee Edge는 오류 코드protocol.http.BadPath
와 함께500 Internal Server Error
를 반환합니다.샘플 #3
샘플 #3:
target.url
변수를 업데이트하는AssignMessage 정책<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
의 값에는 다음과 같은 구성요소가 있습니다.- 스키마:
https
- 권한:
mocktarget.apigee.net
- 경로:
?echo
이 예시에서 경로는 잘못된 슬래시 (
/
) 대신 물음표 (?
)로 시작합니다. 따라서 Apigee Edge는 오류 코드protocol.http.BadPath
와 함께500 Internal Server Error
를 반환합니다.- 스키마:
해상도
URL 사양
RFC 3986, 섹션 3: 구문 구성요소에 따라 path
구성요소는 필수이며 항상 '/'로 시작해야 합니다(MUST). 따라서 이 문제를 해결하려면 아래 단계를 따르세요.
- 흐름 변수
target.url
로 표시되는 백엔드 서버 URL에 항상 유효한 경로가 있고 항상 슬래시 (/
)로 시작하는지 확인합니다.- 경우에 따라 경로에 리소스 이름이 없을 수 있습니다. 이 경우 경로에 적어도 슬래시 (
/
)가 있는지 확인합니다. - 다른 변수를 사용하여 흐름 변수
target.url
의 값을 결정하는 경우 다른 변수에 잘못된 경로가 없는지 확인합니다. - 문자열 작업을 실행하여 흐름 변수
target.url
의 값을 확인하는 경우 문자열 작업의 결과나 결과에 잘못된 경로가 없는지 확인합니다.
- 경우에 따라 경로에 리소스 이름이 없을 수 있습니다. 이 경우 경로에 적어도 슬래시 (
위에서 설명한 샘플에서 아래 설명된 대로 이 문제를 해결할 수 있습니다.
샘플 #1
샘플 #1:
target.url
변수를 업데이트하는 JavaScript 정책이 문제를 해결하려면 변수
url
에 물음표(?
) 대신 슬래시(/
)를 사용합니다(아래 참고).var url = "https://mocktarget.apigee.net/json" context.setVariable("target.url", url);
샘플 #2
샘플 #2: 요청 헤더의 값에 따라
target.url
변수를 업데이트하는 JavaScript 정책var path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
이 문제를 해결하려면 아래와 같이 유효한 경로(예:
/user
)를 요청 헤더Path
의 일부로 전달해야 합니다.샘플 요청:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /user"
샘플 #3
샘플 #3:
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: 구문 구성요소 RFC 3986, 섹션 3.3: 경로 Apigee 지원의 도움이 더 필요하면 진단 정보를 수집해야 하는 경우로 이동하세요.
진단 정보 수집 필요
위의 안내를 따른 후에도 문제가 지속되면 다음 진단 정보를 수집한 다음 Apigee Edge 지원팀에 문의하세요.
Public Cloud 사용자인 경우 다음 정보를 제공합니다.
- 조직 이름
- 환경 이름
- API 프록시 이름
500 Internal Server Error
을 재현하는 데 사용된curl
명령어 전체와 오류 코드protocol.http.BadPath
- API 요청에 대한 추적 파일
Private Cloud 사용자인 경우 다음 정보를 제공하세요.
- 실패한 요청에 대해 발견된 전체 오류 메시지
- 환경 이름
- API 프록시 번들
- 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
참조