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 khách sẽ nhận được mã trạng thái HTTP 500 Internal Server Error
kèm theo
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 sẽ 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 (?
)
dấu gạch chéo lên (/
), 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à bắt buộc và 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 một dấu chấm hỏi (?
) thay vì dấu gạch chéo lên (/
), sau đó là Apigee
Edge 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 khi
path
được phát hiện là không hợp lệ vì giá trị này bắt đầu bằng một dấu chấm hỏi
(?
) thay vì dấu gạch chéo lên (/
).
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ợ được biểu thị bằng biến luồng
target.url bắt đầu bằng một dấu chấm hỏi (? ) thay vì dấu chuyển tiếp
dấu gạch chéo (/ ). |
Người dùng Edge công khai và riêng tư |
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 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ò thích hợp.
Chuyển sang tổ chức mà bạn muốn điều tra vấn đề này.
- Chuyển đến thẻ Analyze (Phân tích) > Giám sát API > Điều tra.
- Chọn khung thời gian cụ thể mà bạn phát hiện thấy lỗi.
Vẽ Mã lỗi theo Thời gian.
Chọn một ô có mã lỗi
protocol.http.BadPath
như hình minh hoạ bên dưới:Thông tin về mã lỗi
protocol.http.BadPath
được hiển thị dưới dạng được hiển thị bên dưới:Nhấp vào Xem nhật ký rồi mở rộng hàng chứa yêu cầu không thành công.
- Từ cửa sổ Logs (Nhật ký), hãy lưu ý những thông tin chi tiết 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
, thì điều đó cho biết rằng URL máy chủ phụ trợ có chứa đường dẫn không hợp lệ.
Trace
Quy trình 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 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 chế độ Show all FlowInfos (Hiện tất cả FlowInfos):
- 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 của quá trình theo dõi và xác định nơi xảy ra lỗi.
Bạn thường sẽ thấy lỗi này trong một quy trình sau khi Luồng yêu cầu mục tiêu bắt đầu giai đoạn như sau:
Lưu ý giá trị của lỗi trong dấu vết:
lỗi: Đường dẫn yêu cầu không hợp lệ
Vì lỗi này do Apigee Edge đưa ra sau khi Luồng yêu cầu mục tiêu bắt đầu thì dấu hiệu 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 sẽ có nhiều khả năng xảy ra nhất nếu biến luồng
target.url
(đại diện cho URL cho 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 Các biến đã đọc và được gán trong mỗi luồng ngược lại từ luồng lỗi chuyển sang giai đoạn 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
là đã 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 ở trên, hãy lưu ý giá trị của biến luồng
target.url
được cập nhật trong chính sách JavaScript có tên làJS- SetTargetURL
như sau:target.url : https://mocktarget.apigee.net?json
- Lưu ý rằng giá trị trong
target.url
có các thành phần sau:- lược đồ:
https
- authority:
mocktarget.apigee.net
- đường dẫn:
?json
- lược đồ:
- Vì thành phần path bắt đầu bằng một dấu chấm hỏi (
?
) thay vì dấu gạch chéo lên (/
), bạn sẽ gặp lỗiInvalid request path
. - Chuyển đến Giai đoạn AX (Đã ghi dữ liệu Analytics) trong dấu vết và nhấp vào đó.
Cuộn xuống phần Chi tiết giai đoạn – Tiêu đề lỗi rồi xác định của X-Apigee-fault-code và X-Apigee-fault-source như sau:
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.BadPath
và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.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ể sử 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ỗi hay khôngprotocol.http.BadPath
trong một khoảng thời gian cụ thể (nếu sự cố xảy ra trong trước đây) hoặc nếu có bất kỳ yêu cầu nào vẫn không thành công với500
. Nếu bạn tìm thấy lỗi
500
khi so khớp X-Apigee-fault-code giá trị củaprotocol.http.BadPath
, sau đó xác định giá trị của X- Apigee-lỗi nguồn.Lỗi 500 mẫu trong nhật ký truy cập NGINX:
Mục nhập mẫu ở trên từ nhật ký truy cập NGINX có các giá trị sau cho X-Apigee- error-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 các giá trị của X-Apigee-fault-code và X-Apigee-fault-source là
protocol.http.BadPath
vàtarget
lần lượt, cho biết lỗi này là 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ó một đườ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 nhật ký Giám sát API, Công cụ theo dõi hoặc NGINX như giải thích trong 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ótarget
, thì điều này cho biết rằng URL máy chủ phụ trợ có thông tin không hợp lệ path. URL máy chủ phụ trợ được biểu thị bằng biến luồng
target.url
trong Apigee Cạnh. Lỗi này thường xảy ra nếu bạn cố cập nhật URL máy chủ phụ trợ (target.url
) linh động 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 luồng này có đường dẫn không hợp lệ.Xác định xem biến luồng
target.url
có thực sự có giá trị không hợp lệ hay không path và nguồn của giá trị đó 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 đã thu thập được dấu vết cho lỗi này, hãy làm theo các bước như được giải thích trong 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 này 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
- đường dẫn:
?json
Đường dẫn bắt đầu bằng một dấu chấm hỏi (
?
) thay vì một dấu chuyển tiếp dấu gạch chéo (/
), 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ố không liên tục), 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
, sử dụng các chính sách như MessageLogging hoặc Chính sách ServiceAnnotation cho máy chủ nhật ký của bạn. - Nếu bạn có nhật ký, hãy xem lại 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 đã sửa đổi hay không
target.url
chứa đường dẫn không hợp lệ
- Xác minh xem
Proxy API
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 lại API không đạt proxy để xác định nội dung đã sửa đổi hoặc cập nhật biến luồng
target.url
có chứa đườ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 luồng được chia sẻ được gọi từ proxy
- Xác minh xem
Kiểm tra kỹ chính sách cụ thể (ví dụ: ExampleMessage hoặc JavaScript) có chức năng sửa đổi hoặc cập nhật biến luồng
target.url
và xác định nguyên nhân gây ra đang cập nhậttarget.url
thành một đường dẫn không hợp lệ.Dưới đây là một vài chính sách mẫu cập nhật biến luồng
target.url
không đúng để chứa đường dẫn không hợp lệ dẫn đến lỗi này.Mẫu số 1
Mẫu số 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
có trong một giá trị khác biếnurl.
Lưu ý rằng giá trị của
url
có các thành phần sau:- lược đồ:
https
- authority:
mocktarget.apigee.net
- đường dẫn:
?json
Đường dẫn bắt đầu bằng một dấu chấm hỏi (
?
) thay vì dấu gạch chéo lên (/
) là không hợp lệ. Do đó, Apigee Edge trở lại500 Internal Server Error
có mã lỗiprotocol.http.BadPath
.Mẫu số 2
Mẫu số 2: Chính sách JavaScript đang cập nhật biến
target.url
dự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, 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ó trong một biếnurl
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ế, 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 của người dùng
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
.Do đó:
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
- đường dẫn:
?user
Đường dẫn bắt đầu bằng một dấu chấm hỏi (
?
) thay vì dấu gạch chéo lên (/
) là không hợp lệ. Do đó, Apigee Edge trả về500 Internal Server Error
với mã lỗiprotocol.http.BadPath
.Mẫu số 3
Mẫu số 3: Chính sách AssignmentsMessage 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
- đường dẫn:
?echo
Một lần nữa trong ví dụ này, đường dẫn bắt đầu bằng một dấu chấm hỏi (
?
) thay cho dấu gạch chéo lên (/
) là không hợp lệ. Do đó, Apigee Edge trả về500 Internal Server Error
kèm mã lỗiprotocol.http.BadPath
.- lược đồ:
Độ phân giải
Theo đặc tả URL
RFC 3986, mục 3: Các thành phần cú pháp, bắt buộc phải thành phần path
và mã đó 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 sự cố 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à đường dẫn 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, hãy đảm bảo rằng
đường dẫn ít nhất có dấu gạch chéo lên (
/
). - Trường hợp 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
, sau đó đả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 chuỗi nào để xác định giá trị của biến luồng
target.url
, sau đó đảm bảo rằng kết quả của chuỗi các toán tử 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, hãy đảm bảo rằng
đường dẫn ít nhất có dấu gạch chéo lên (
Trong các mẫu thảo luận ở trên, bạn có thể khắc phục vấn đề theo cách giải thích dưới đây:
Mẫu số 1
Mẫu số 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
Mẫu số 2: Chính sách JavaScript đang cập nhật biến
target.url
dự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);
Hãy đảm bảo rằng bạn truyền một đường dẫn hợp lệ, ví dụ:
/user
trong yêu cầu tiêu đềPath
để khắc phục sự cố này như được hiển thị 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 AssignmentsMessage 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 AllowedMessage. Tức là thay thế dấu chấm hỏi (?
) bằng a dấu gạch chéo lên (/
) trong phần tử<Value>
và đặt chính sách đó thànhhttps://mocktarget.apigee.net/echo
để khắc phục vấn đề này như trình bày 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 dự kiến rằng thành phần
path
trong URL máy chủ phụ trợ PHẢI luôn bắt đầu bằng dấu gạch chéo lên (/
) theo dấu sau thông số kỹ thuật:Thông số kỹ thuật RFC 3986, mục 3: Thành phần cú pháp RFC 3986, mục 3.3: Đường dẫn Nếu bạn vẫn cần hỗ trợ từ Nhóm hỗ trợ Apigee, 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 ngay cả sau khi đã làm theo các hướng dẫn trên, hãy thu thập những thông tin sau thông tin chẩn đoán rồi liên hệ với Bộ phận hỗ trợ Apigee Edge:
Nếu bạn là người dùng Cloud Public, 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
với 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 các thông tin sau:
- Đã nhậ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ực hiện được
- 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
Vị trí: ORG, ENV và PORT# được thay thế bằng giá trị thực tế.
- Nhật ký hệ thống của Trình xử lý thư
/opt/apigee/var/log/edge-message- processor/logs/system.log
Tài liệu tham khảo