Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến tài liệu về
Apigee X. thông tin
Triệu chứng
Ứng dụng sẽ nhận một mã trạng thái HTTP của 500 Internal Server Error
với mã lỗi protocol.http.BadPath
làm phản hồi cho 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 đây:
HTTP/1.1 500 Internal Server Error
Ngoài ra, bạn có thể nhận 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ợ (được biểu thị bằng biến luồng target.url
) chứa path
bắt đầu bằng dấu chấm hỏi (?
) thay vì dấu gạch chéo lên (/
). Giá trị này không hợp lệ.
Theo thông số kỹ thuật RFC 3986, mục 3: Thành phần cú pháp và RFC 3986, mục 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
path
là required và thành phần này PHẢI bắt đầu bằng 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ó thành phần path
bắt đầu bằng dấu chấm hỏi (?
) thay vì dấu gạch chéo lên (/
), thì Apigee 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ì lỗi này bắt đầu bằng dấu chấm hỏi (?
) thay vì dấu gạch chéo lên (/
).
Nguyên nhân | Nội dung 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 của máy chủ phụ trợ được biểu thị bằng biến luồng target.url bắt đầu bằng dấu chấm hỏi (? ) thay vì dấu gạch chéo lên (/ ). |
Người dùng Edge Public và Private Cloud |
Các bước chẩn đoán phổ biến
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 số 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à một người dùng có vai trò thích 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 quan sát thấy lỗi.
Vẽ Mã lỗi dựa trên Thời gian.
Chọn một ô có mã lỗi
protocol.http.BadPath
như minh hoạ dưới đây:Thông tin về mã lỗi
protocol.http.BadPath
hiển thị như sau:Nhấp vào Xem nhật ký rồi mở rộng hàng cho yêu cầu không thành công.
- Trong cửa sổ Logs (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à
target
và Mã lỗi làprotocol.http.BadPath
, tức là URL máy chủ phụ trợ có đường dẫn không hợp lệ.
Trace
Quy trình số 2: Sử dụng công cụ Theo dõi
Cách chẩn đoán lỗi bằng công cụ Theo dõi:
- Bật tính năng phiên theo dõi và
- Chờ lỗi
500 Internal Server Error
xả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 tuỳ chọn Show all FlowInfos (Hiện tất cả thông tin luồng):
- Chọn một trong các yêu cầu không thành công rồi kiểm tra dấu vết.
- Di chuyển qua các giai đoạn trong quá trình theo dõi 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: Đường dẫn yêu cầu không hợp lệ
Vì lỗi này được Apigee Edge báo cáo sau giai đoạn Bắt đầu luồng yêu cầu mục tiêu, nên lỗi này cho biết rằng URL máy chủ phụ trợ có đường dẫn không hợp lệ. Điều này rất có thể sẽ 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 quy trình yêu cầu mục tiêu.- Kiểm tra phần Biến đã đọc và được chỉ định trong mỗi luồng ngược từ luồng lỗi đến giai đoạn Đã bắt đầu luồng yêu cầu mục tiêu.
- Xác định chính sách mà 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 nêu trên, hãy lưu ý rằng giá trị của biến luồng
target.url
được cập nhật trong chính sách JavaScript có tênJS- SetTargetURL
như sau:target.url : https://mocktarget.apigee.net?json
- Xin lưu ý rằng giá trị trong
target.url
có các thành phần sau:- lược đồ:
https
- authority:
mocktarget.apigee.net
- path:
?json
- lược đồ:
- Vì thành phần path 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 phân tích đã ghi lại) trong dấu vết rồi nhấp vào đó.
Di chuyển xuống mục Giai đoạn chi tiết – Tiêu đề lỗi (Error Headers) rồi xác định giá trị của X-Apigee-fault-code và X-Apigee-fault-source như sau:
Bạn sẽ thấy các giá trị tương ứng của X-Apigee-fault-code và X-Apigee-fault-source là
protocol.http.BadPath
vàtarget
, cho biết lỗi này xảy ra vì 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.BadPath
X-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 tư, bạn có thể dùng nhật ký truy cập NGINX để xác định thông tin chính về HTTP
500 Internal Server Error
. Kiểm tra nhật ký truy cập NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- Tìm kiếm để xem có lỗi
500
nào với mã lỗiprotocol.http.BadPath
trong 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ới500
hay không. Nếu bạn tìm thấy bất kỳ lỗi
500
nào trong quá trình so khớp X-Apigee-fault-code với giá trị của X-Apigee-fault-code , hãy xác định giá trị của X-Apigee-fault-codeVí dụ về lỗi 500 trong nhật ký truy cập NGINX:
Mục mẫu ở trên từ 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.BadPath
X-Apigee-fault-source target
Lưu ý rằng giá trị của X-Apigee-fault-code và X-Apigee-fault-source lần lượt là
protocol.http.BadPath
vàtarget
, cho biết lỗi này xảy ra vì 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 Error
bằ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ư 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.BadPath
và Nguồn lỗi có giá trịtarget
, thì tức 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.url
trong Apigee Edge. Lỗi này thường xảy ra nếu bạn cố cập nhật URL của máy chủ phụ trợ (target.url
) linh động bằng bất kỳ chính sách nào (trong luồng proxy/luồng dùng chung) trong quy trình yêu cầu mục tiêu, do đó có đường dẫn không hợp lệ.Hãy xác định xem biến luồng
target.url
có thực sự có đường dẫn không hợp lệ và nguồn cho giá trị của biến đó hay không 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 của lỗi này, hãy sử dụng các bước như giải thích trong bài viết Sử dụng công cụ Theo dõi và
- Xác minh xem
target.url
có đườ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 hiểu chính sách đã sửa đổi hoặc cập nhật giá trị của
target.url
để chứa đườ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.url
có các thành phần sau:- lược đồ:
https
- authority:
mocktarget.apigee.net
- path:
?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 đó không hợp lệ. - lược đồ:
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 (sự cố gián đoạn), hãy kiểm tra xem
bạn đã ghi lại thông tin về giá trị của biến luồng
target.url
hay chưa, bằng cách sử dụng các chính sách như MessageLogging hoặc ServiceAnnotation đến máy chủ nhật ký. - Nếu bạn có nhật ký, hãy kiểm tra và
- Xác minh xem
target.url
có đườ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
Proxy API
Xem lại 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 lại proxy API không thành công để xác định hành động sửa đổi hoặc cập nhật biến luồng
target.url
để chứa đường dẫn không hợp lệ. Kiểm tra những thông tin sau:- Chính sách trong proxy API
- Mọi luồng dùng chung được gọi từ proxy
- Xác minh xem
Kiểm tra kỹ chính sách cụ thể (Ví dụ:: AssignmentsMessage hoặc JavaScript) sửa đổi hoặc cập nhật biến luồng
target.url
và xác định nguyên nhân để cập nhậttarget.url
có đường dẫn không hợp lệ.Dưới đây là một số ví dụ về chính sách cập nhật biến luồng
target.url
khô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: Chính sách JavaScript cập nhật biến
target.url
var url = "https://mocktarget.apigee.net?json" context.setVariable("target.url", url);
Trong mẫu trên, lưu ý rằng biến luồng
target.url
được cập nhật với giá trịhttps://mocktarget.apigee.net?json
chứa trong một biếnurl.
khácXin lưu ý rằng giá trị của
url
có các thành phần sau:- lược đồ:
https
- authority:
mocktarget.apigee.net
- path:
?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 (/
), là dấu không hợp lệ. Do đó, Apigee Edge sẽ trả về500 Internal Server Error
kèm theo mã lỗiprotocol.http.BadPath
.Mẫu số 2
Ví dụ 2: Chính sách JavaScript cập nhật biến
target.url
dựa trên giá trị trong tiêu đề 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.net
có trongurl
và giá trị của một biến khácpath
, có giá trị đượ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 tế được truyền đến
request.header.Path
.Yêu cầu mẫu do người dùng đưa ra
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
path
trong chính sách JavaScript lànull
.Vì vậy:
url = https://mocktarget.apigee.net + path
url = https://mocktarget.apigee.net + "?user"
target.url = https://mocktarget.apigee.net?user
Xin lưu ý rằng giá trị của
target.url
có các thành phần sau:- lược đồ:
https
- authority:
mocktarget.apigee.net
- path:
?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 (/
), là dấu không hợp lệ. Do đó, Apigee Edge sẽ trả về500 Internal Server Error
với mã lỗiprotocol.http.BadPath
.Mẫu số 3
Ví dụ 3: Chính sách composeMessage 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
url
có các thành phần sau:- lược đồ:
https
- authority:
mocktarget.apigee.net
- path:
?echo
Một lần nữa, 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 (/
), là dấu không hợp lệ. Do đó, Apigee Edge sẽ trả về500 Internal Server Error
kèm theo mã lỗiprotocol.http.BadPath
.- lược đồ:
Độ phân giải
Theo thông số kỹ thuật của URL
RFC 3986, phần 3: Thành phần cú pháp, thành phần path
là bắt buộc và phải luôn bắt đầu bằng "/". Vì vậy, hãy làm theo các bước dưới đây để 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.url
) luôn có đường dẫn hợp lệ và URL này luôn bắt đầu bằng dấu gạch chéo lên (/
).- 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, do đó hãy đảm bảo đường dẫn đó ít nhất có một dấu gạch chéo xuôi (
/
). - 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 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 chuỗi nào để xác định giá trị của biến luồng
target.url
, hãy đảm bảo rằng kết quả của các thao tác 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, do đó hãy đảm bảo đường dẫn đó ít nhất có một dấu gạch chéo xuôi (
Trong các ví dụ được thảo luận ở trên, bạn có thể khắc phục sự cố này theo giải thích dưới đây:
Mẫu số 1
Ví dụ 1: Chính sách JavaScript cập nhật biến
target.url
Sử dụng dấu gạch chéo lên (
/
) thay vì dấu chấm hỏi (?
) trong biếnurl
để khắc phục vấn đề này như sau: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.url
dựa trên giá trị trong tiêu đề yêu cầuvar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
Hãy đảm bảo rằng bạn truyền một đường dẫn hợp lệ, ví dụ:
/user
trong tiêu đề của yêu cầuPath
để khắc phục vấn đề này như minh hoạ dưới đây:Yêu cầu mẫu:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /user"
Mẫu số 3
Mẫu số 3: Chính sách composeMessage cập nhật biến
target.url
Thêm một đường dẫn hợp lệ trong phần tử
<Value>
của chính sách AttributionMessage. 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 thànhhttps://mocktarget.apigee.net/echo
để khắc phục vấn đề này như sau:<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 dự kiến rằng
path
thành phần trong URL của máy chủ phụ trợ PHẢI luôn bắt đầu bằng dấu gạch chéo lên (/
) theo thông số kỹ thuật sau đây: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 Nhóm hỗ trợ Apigee hỗ trợ, hãy chuyển đến trang Phải thu thập thông tin chẩn đoán.
Phải thu thập thông tin chẩn đoán
Nếu sự cố vẫn tiếp diễn sau khi đã 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 Bộ phận hỗ trợ Apigee:
Nếu bạn là người dùng Public Cloud, 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
- Hoàn tất lệnh
curl
dùng để tái tạo500 Internal Server Error
có 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 tư, hãy cung cấp những thông tin sau:
- Đã phát hiện thấy thông báo lỗi hoàn chỉnh đối với 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_log
Trong đó: ORG, ENV và PORT# được thay thế bằng giá trị thực tế.
- Nhật ký hệ thống của Bộ xử lý thư
/opt/apigee/var/log/edge-message- processor/logs/system.log
Tài liệu tham khảo