Bạn đang xem tài liệu về Apigee Edge.
Truy cập vào
tài liệu Apigee X. thông tin
Dấu hiệu
Ứng dụng khách nhận được mã trạng thái HTTP 500 Internal Server Error với mã lỗi protocol.http.BadPath làm phản hồi cho các lệnh gọi API.
Thông báo lỗi
Ứng dụng khách nhận được mã phản hồi sau:
HTTP/1.1 500 Internal Server Error
Ngoài ra, bạn có thể thấy thông báo lỗi sau:
{
"fault":{
"faultstring":"Invalid request path",
"detail":{
"errorcode":"protocol.http.BadPath"
}
}
}Các nguyên nhân có thể
Lỗi này xảy ra nếu URL yêu cầu của máy chủ phụ trợ (do biến luồng target.url biểu thị) chứa một path bắt đầu bằng dấu chấm hỏi (?) thay vì dấu gạch chéo (/). Đây là không hợp lệ.
Theo quy cách RFC 3986, phần 3: Thành phần cú pháp và RFC 3986, phần 3.3: Đường dẫn:
Cú pháp URI có các thành phần sau:
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment- Thành phần
pathlà bắt buộc và PHẢI bắt đầu bằng dấu gạch chéo lên (/) và luôn có dấu gạch chéo lên.
Do đó, nếu URL yêu cầu của máy chủ phụ trợ có một thành phần path bắt đầu bằng dấu chấm hỏi (?) thay vì dấu gạch chéo (/), thì Apigee Edge sẽ phản hồi bằng 500 Internal Server Error và mã lỗi protocol.http.BadPath.
Ví dụ: Nếu target.url có giá trị https://www.mocktarget.apigee.net?json, thì lỗi này sẽ xảy ra vì path được phát hiện là không hợp lệ,vì giá trị này bắt đầu bằng dấu chấm hỏi (?) thay vì dấu gạch chéo (/).
| Nguyên nhân | Mô tả | Hướng dẫn khắc phục sự cố áp dụng cho |
|---|---|---|
| URL máy chủ phụ trợ (target.url) có đường dẫn không hợp lệ | Thành phần đường dẫn trong URL máy chủ phụ trợ do biến luồng target.url đại diện bắt đầu bằng dấu chấm hỏi (?) thay vì dấu gạch chéo (/). |
Người dùng Edge Public Cloud và Private Cloud |
Các bước chẩn đoán thường gặp
Hãy sử dụng một trong các công cụ/kỹ thuật sau để chẩn đoán lỗi này:
Giám sát API
Quy trình 1: Sử dụng tính năng Giám sát API
Cách chẩn đoán lỗi bằng tính năng Giám sát API:
- Đăng nhập vào giao diện người dùng Apigee Edge với tư cách là người dùng có vai trò phù hợp.
Chuyển sang tổ chức mà bạn muốn điều tra vấn đề.
- Chuyển đến trang Phân tích > Giám sát API > Điều tra.
- Chọn khung thời gian cụ thể mà bạn nhận thấy lỗi.
Vẽ Mã lỗi theo Thời gian.
Chọn một ô có mã lỗi
protocol.http.BadPathnhư minh hoạ bên dưới:
Thông tin về mã lỗi
protocol.http.BadPathsẽ xuất hiện như hình dưới đây:
Nhấp vào Xem nhật ký rồi mở rộng hàng của yêu cầu không thực hiện được.
- Trong cửa sổ Nhật ký, hãy lưu ý những thông tin sau:
- Mã trạng thái:
500 - Nguồn lỗi:
target - Mã lỗi:
protocol.http.BadPath
- Mã trạng thái:
- Nếu Nguồn lỗi là
targetvà Mã lỗi làprotocol.http.BadPath, thì điều đó có nghĩa là URL máy chủ phụ trợ có một đường dẫn không hợp lệ.
Trace
Quy trình 2: Sử dụng công cụ Trace
Cách chẩn đoán lỗi bằng công cụ Trace (Theo dõi):
- Bật phiên theo dõi và một trong hai
- Chờ lỗi
500 Internal Server Errorxảy ra, hoặc - Nếu bạn có thể tái hiện vấn đề, hãy thực hiện lệnh gọi API để tái hiện vấn đề
500 Internal Server Error
- Chờ lỗi
Đảm bảo bạn đã bật chế độ Show all FlowInfos (Hiện tất cả FlowInfo):

- Chọn một trong các yêu cầu không thực hiện được và kiểm tra dấu vết.
- Điều hướng qua các giai đoạn khác nhau của dấu vết và xác định vị trí xảy ra lỗi.
Bạn thường sẽ thấy lỗi này trong một quy trình sau giai đoạn Đã bắt đầu quy trình yêu cầu mục tiêu như minh hoạ dưới đây:

Lưu ý giá trị của lỗi trong dấu vết:
error: Invalid request path
Vì lỗi này do Apigee Edge đưa ra sau giai đoạn Target Request Flow Started (Đã bắt đầu luồng yêu cầu mục tiêu), nên lỗi này cho biết URL máy chủ phụ trợ có đường dẫn không hợp lệ. Điều này rất có thể xảy ra nếu biến luồng
target.url(đại diện cho URL của máy chủ phụ trợ) trong Apigee Edge có thể đã được cập nhật bằng một đường dẫn không hợp lệ thông qua một trong các chính sách trong luồng yêu cầu mục tiêu.- Kiểm tra phần Variables Read and Assigned (Các biến được đọc và gán) trong mỗi luồng ngược từ luồng lỗi về phía giai đoạn Target Request Flow Started (Đã bắt đầu luồng yêu cầu mục tiêu).
- Xác định chính sách, trong đó biến luồng
target.urlđã được cập nhật:Dấu vết mẫu cho thấy chính sách JavaScript đã cập nhật biến luồng
target.url:
Trong dấu vết mẫu xuất hiện ở trên, hãy lưu ý rằng giá trị của biến luồng
target.urlđược cập nhật trong một chính sách JavaScript có tên làJS- SetTargetURLnhư sau:target.url : https://mocktarget.apigee.net?json - Xin lưu ý rằng giá trị trong
target.urlcó các thành phần sau:- scheme:
https - authority:
mocktarget.apigee.net - đường dẫn:
?json
- scheme:
- Vì thành phần đường dẫn bắt đầu bằng dấu chấm hỏi (
?) thay vì dấu gạch chéo lên (/), nên bạn sẽ gặp lỗiInvalid request path. - Chuyển đến Giai đoạn AX (Dữ liệu Analytics được ghi lại) trong dấu vết rồi nhấp vào giai đoạn đó.
Di chuyển xuống phần Phase Details (Thông tin chi tiết về giai đoạn) – Error Headers (Tiêu đề lỗi) và xác định các giá trị của X-Apigee-fault-code (Mã lỗi X-Apigee) và X-Apigee-fault-source (Nguồn lỗi X-Apigee) như minh hoạ dưới đây:

Bạn sẽ thấy các giá trị của X-Apigee-fault-code và X-Apigee-fault-source lần lượt là
protocol.http.BadPathvàtarget, cho biết rằng lỗi này xảy ra do URL máy chủ phụ trợ có đường dẫn không hợp lệ.Tiêu đề phản hồi Giá trị X-Apigee-fault-code protocol.http.BadPathX-Apigee-fault-source target
NGINX
Quy trình 3: Sử dụng nhật ký truy cập NGINX
Cách chẩn đoán lỗi bằng nhật ký truy cập NGINX:
- Nếu là người dùng Đám mây riêng, bạn có thể sử dụng nhật ký truy cập NGINX để xác định thông tin chính về
500 Internal Server ErrorHTTP. Kiểm tra nhật ký truy cập NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log- Tìm xem có lỗi
500nào với mã lỗiprotocol.http.BadPathtrong một khoảng thời gian cụ thể hay không (nếu vấn đề xảy ra trong quá khứ) hoặc có yêu cầu nào vẫn không thành công với500hay không. Nếu bạn thấy bất kỳ lỗi
500nào có X-Apigee-fault-code khớp với giá trị củaprotocol.http.BadPath, thì hãy xác định giá trị của X-Apigee-fault-source.Ví dụ về lỗi 500 trong nhật ký truy cập của NGINX:
Mục nhập mẫu ở trên trong nhật ký truy cập NGINX có các giá trị sau cho X-Apigee-fault-code và X-Apigee-fault-source:
Tiêu đề Giá trị X-Apigee-fault-code protocol.http.BadPathX-Apigee-fault-source targetLưu ý rằng các giá trị của X-Apigee-fault-code và X-Apigee-fault-source lần lượt là
protocol.http.BadPathvàtarget, cho biết lỗi này xảy ra do URL máy chủ phụ trợ có đường dẫn không hợp lệ.
Nguyên nhân: URL máy chủ phụ trợ (target.url) có đường dẫn không hợp lệ
Chẩn đoán
- Xác định Mã lỗi và Nguồn lỗi cho
500 Internal Server Errorbằng cách sử dụng tính năng Giám sát API, Công cụ theo dõi hoặc nhật ký truy cập NGINX như được giải thích trong phần Các bước chẩn đoán thường gặp. - Nếu Mã lỗi là
protocol.http.BadPathvà Nguồn lỗi có giá trịtarget, thì điều này có nghĩa là URL máy chủ phụ trợ có đường dẫn không hợp lệ. URL máy chủ phụ trợ được biểu thị bằng biến luồng
target.urltrong Apigee Edge. Lỗi này thường xảy ra nếu bạn cố gắng cập nhật URL máy chủ phụ trợ (target.url) một cách linh động bằng cách sử dụng bất kỳ chính sách nào (trong proxy/luồng dùng chung) trong luồng yêu cầu Mục tiêu, sao cho chính sách đó có đường dẫn không hợp lệ.Xác định xem biến luồng
target.urlcó thực sự có một đường dẫn không hợp lệ và nguồn cho giá trị của biến đó bằng một trong các phương thức sau:Trace
Sử dụng công cụ Theo dõi
Nếu bạn đã ghi lại dấu vết cho lỗi này, hãy sử dụng các bước như được giải thích trong phần Sử dụng công cụ Dấu vết và
- Xác minh xem
target.urlcó đường dẫn không hợp lệ hay không, tức là nếu đường dẫn đó bắt đầu bằng dấu chấm hỏi (?) thay vì dấu gạch chéo lên (/). Nếu có, hãy tìm chính sách đã sửa đổi hoặc cập nhật giá trị của
target.urlđể chứa một đường dẫn không hợp lệ.Dấu vết mẫu cho thấy chính sách JavaScript đã cập nhật biến luồng
target.url
- Trong dấu vết mẫu ở trên, hãy lưu ý rằng chính sách JavaScript đã sửa đổi hoặc cập nhật giá trị của
target.urlđể chứa một đường dẫn không hợp lệ. - Xin lưu ý rằng
target.urlcó các thành phần sau:- scheme:
https - authority:
mocktarget.apigee.net - đường dẫn:
?json
Đường dẫn bắt đầu bằng dấu chấm hỏi (
?) thay vì dấu gạch chéo lên (/), do đó, đường dẫn này không hợp lệ. - scheme:
Nhật ký
Sử dụng nhật ký trong máy chủ nhật ký
- Nếu bạn không có dấu vết cho lỗi này (một vấn đề không liên tục), hãy kiểm tra xem bạn đã ghi thông tin về giá trị của biến luồng
target.urlhay chưa, bằng cách sử dụng các chính sách như MessageLogging hoặc ServiceCallout cho máy chủ nhật ký của bạn. - Nếu bạn có nhật ký, hãy xem xét nhật ký và
- Xác minh xem
target.urlcó đường dẫn không hợp lệ hay không, và - Xem liệu bạn có thể xác định thông tin về chính sách nào đã sửa đổi
target.urlđể chứa đường dẫn không hợp lệ hay không
- Xác minh xem
API proxy
Xem xét proxy API không thành công
Nếu bạn không có dấu vết hoặc nhật ký cho lỗi này, hãy xem xét proxy API không thành công để xác định những gì đã sửa đổi hoặc cập nhật biến luồng
target.urlđể chứa một đường dẫn không hợp lệ. Kiểm tra những điều sau:- Chính sách trong proxy API
- Mọi quy trình được chia sẻ đều được gọi từ proxy
- Xác minh xem
Kiểm tra kỹ chính sách cụ thể (Ví dụ: AssignMessage hoặc JavaScript) sửa đổi hoặc cập nhật biến luồng
target.urlvà xác định nguyên nhân khiến việc cập nhậttarget.urlcó đường dẫn không hợp lệ.Sau đây là một vài ví dụ về các chính sách cập nhật biến luồng
target.urlkhông chính xác để chứa một đường dẫn không hợp lệ dẫn đến lỗi này.Mẫu số 1
Ví dụ 1: Biến
target.urlcập nhật Chính sách JavaScriptvar url = "https://mocktarget.apigee.net?json" context.setVariable("target.url", url);
Trong mẫu ở trên, hãy lưu ý rằng biến luồng
target.urlđược cập nhật bằng giá trịhttps://mocktarget.apigee.net?jsoncó trong một biến khácurl.Xin lưu ý rằng giá trị của
urlcó các thành phần sau:- scheme:
https - authority:
mocktarget.apigee.net - đường dẫn:
?json
Đường dẫn bắt đầu bằng dấu chấm hỏi (
?) thay vì dấu gạch chéo lên (/), đây là đường dẫn không hợp lệ. Do đó, Apigee Edge sẽ trả về500 Internal Server Errorvới mã lỗiprotocol.http.BadPath.Mẫu số 2
Ví dụ 2: Chính sách JavaScript cập nhật biến
target.urldựa trên giá trị trong tiêu đề của yêu cầuvar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
Trong mẫu trên, hãy lưu ý rằng biến luồng
target.urlđược cập nhật bằng cách nối giá trịhttps://mocktarget.apigee.netcó trong biếnurlvà giá trị của một biến khácpath, giá trị của biến này được truy xuất từrequest.header.Path.Nếu có quyền truy cập vào yêu cầu hoặc dấu vết thực tế, thì bạn có thể xác minh giá trị thực được truyền đến
request.header.Path.Yêu cầu mẫu do người dùng thực hiện
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: ?user"
Trong ví dụ này, đường dẫn tiêu đề không được gửi trong yêu cầu. Do đó, giá trị của biến
pathtrong chính sách JavaScript lànull.Do đó:
url = https://mocktarget.apigee.net + pathurl = https://mocktarget.apigee.net + "?user"target.url = https://mocktarget.apigee.net?user
Xin lưu ý rằng giá trị của
target.urlcó các thành phần sau:- scheme:
https - authority:
mocktarget.apigee.net - đường dẫn:
?user
Đường dẫn bắt đầu bằng dấu chấm hỏi (
?) thay vì dấu gạch chéo lên (/), đây là đường dẫn không hợp lệ. Do đó, Apigee Edge trả về500 Internal Server Errorvới mã lỗiprotocol.http.BadPath.Ví dụ 3
Ví dụ 3: Chính sách AssignMessage cập nhật biến
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>
Xin lưu ý rằng giá trị của
urlcó các thành phần sau:- scheme:
https - authority:
mocktarget.apigee.net - đường dẫn:
?echo
Trong ví dụ này, đường dẫn bắt đầu bằng dấu chấm hỏi (
?) thay vì dấu gạch chéo lên (/), đây là đường dẫn không hợp lệ. Do đó, Apigee Edge sẽ trả về500 Internal Server Errorvới mã lỗiprotocol.http.BadPath.- scheme:
Độ phân giải
Theo quy cách URL
RFC 3986, phần 3: Thành phần cú pháp, thành phần path là bắt buộc và LUÔN PHẢI bắt đầu bằng "/". Vì vậy, hãy làm theo các bước bên dưới để khắc phục vấn đề này:
- Đảm bảo rằng URL máy chủ phụ trợ, được biểu thị bằng biến luồng
target.urlluôn có đường dẫn hợp lệ và luôn bắt đầu bằng dấu gạch chéo (/).- Trong một số trường hợp, bạn có thể không có tên tài nguyên trong đường dẫn, sau đó đảm bảo rằng đường dẫn có ít nhất một dấu gạch chéo lên (
/). - Nếu bạn sử dụng bất kỳ biến nào khác để xác định giá trị của biến luồng
target.url, hãy đảm bảo rằng các biến khác không có đường dẫn không hợp lệ. - Nếu bạn thực hiện bất kỳ thao tác nào trên chuỗi để xác định giá trị của biến luồng
target.url, hãy đảm bảo rằng kết quả hoặc đầu ra của các thao tác trên chuỗi không có đường dẫn không hợp lệ.
- Trong một số trường hợp, bạn có thể không có tên tài nguyên trong đường dẫn, sau đó đảm bảo rằng đường dẫn có ít nhất một dấu gạch chéo lên (
Trong các mẫu được thảo luận ở trên, bạn có thể khắc phục vấn đề này như giải thích dưới đây:
Mẫu số 1
Ví dụ 1: Biến
target.urlcập nhật Chính sách JavaScriptSử dụng dấu gạch chéo (
/) thay vì dấu chấm hỏi (?) trong biếnurlđể khắc phục vấn đề này như minh hoạ dưới đây:var url = "https://mocktarget.apigee.net/json" context.setVariable("target.url", url);
Mẫu số 2
Ví dụ 2: Chính sách JavaScript cập nhật biến
target.urldựa trên giá trị trong tiêu đề của yêu cầuvar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
Đảm bảo rằng bạn truyền một đường dẫn hợp lệ, ví dụ:
/usertrong tiêu đề yêu cầuPathđể khắc phục vấn đề này như minh hoạ bên dưới:Yêu cầu mẫu:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /user"
Ví dụ 3
Ví dụ 3: Cập nhật biến Chính sách AssignMessage
target.urlThêm một đường dẫn hợp lệ vào phần tử
<Value>của chính sách AssignMessage. Tức là thay thế dấu chấm hỏi (?) bằng dấu gạch chéo lên (/) trong phần tử<Value>và đặt dấu gạch chéo lên thànhhttps://mocktarget.apigee.net/echođể khắc phục vấn đề này như minh hoạ dưới đây:<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>
Thông số kỹ thuật
Apigee Edge yêu cầu
paththành phần trong URL máy chủ phụ trợ LUÔN phải bắt đầu bằng dấu gạch chéo về phía trước (/) theo các quy cách sau:Thông số kỹ thuật RFC 3986, phần 3: Thành phần cú pháp RFC 3986, phần 3.3: Đường dẫn Nếu bạn vẫn cần được Nhóm hỗ trợ Apigee trợ giúp, hãy xem phần Thông tin chẩn đoán bắt buộc phải thu thập.
Phải thu thập thông tin chẩn đoán
Nếu vấn đề vẫn tiếp diễn ngay cả sau khi bạn làm theo hướng dẫn ở trên, hãy thu thập thông tin chẩn đoán sau đây rồi liên hệ với Nhóm hỗ trợ Apigee Edge:
Nếu bạn là người dùng Đám mây công cộng, hãy cung cấp những thông tin sau:
- Tên tổ chức
- Tên môi trường
- Tên proxy API
- Lệnh
curlhoàn chỉnh được dùng để tái tạo500 Internal Server Errorbằng mã lỗiprotocol.http.BadPath - Tệp theo dõi cho các yêu cầu API
Nếu bạn là người dùng Đám mây riêng, hãy cung cấp những thông tin sau:
- Thông báo lỗi hoàn chỉnh được ghi nhận cho các yêu cầu không thành công
- Tên môi trường
- Gói proxy API
- Tệp theo dõi cho các yêu cầu API
Nhật ký truy cập NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logTrong đó: ORG, ENV và PORT# được thay bằng các giá trị thực tế.
- Nhật ký hệ thống của Trình xử lý tin nhắn
/opt/apigee/var/log/edge-message- processor/logs/system.log
Tài liệu tham khảo