Lỗi máy chủ nội bộ 500 - BadPath

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:

  1. 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
    
  2. Thành phần path là 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:

  1. Đă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.
  2. Chuyển sang tổ chức mà bạn muốn điều tra vấn đề.

  3. Chuyển đến trang Phân tích > Giám sát API > Điều tra.
  4. Chọn khung thời gian cụ thể mà bạn nhận thấy lỗi.
  5. Vẽ Mã lỗi theo Thời gian.

  6. Chọn một ô có mã lỗi protocol.http.BadPath như minh hoạ bên dưới:

  7. Thông tin về mã lỗi protocol.http.BadPath sẽ xuất hiện như hình dưới đây:

  8. 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.

  9. 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
  10. Nếu Nguồn lỗi là target và 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):

  1. Bật phiên theo dõi và một trong hai
    • 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
  2. Đảm bảo bạn đã bật chế độ Show all FlowInfos (Hiện tất cả FlowInfo):

  3. 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.
  4. Đ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.
  5. 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:

  6. 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.

  7. 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).
  8. 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- SetTargetURL như sau: target.url : https://mocktarget.apigee.net?json

  9. Xin lưu ý rằng giá trị trong target.url có các thành phần sau:
    • scheme: https
    • authority: mocktarget.apigee.net
    • đường dẫn: ?json
  10. 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ỗi Invalid request path.
  11. 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 đó.
  12. 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:

  13. 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:

  1. 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 Error HTTP.
  2. Kiểm tra nhật ký truy cập NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

  3. Tìm xem có lỗi 500 nào với mã lỗi protocol.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ới 500 hay không.
  4. Nếu bạn thấy bất kỳ lỗi 500 nào có X-Apigee-fault-code khớp với giá trị của protocol.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.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ần lượt là protocol.http.BadPath và 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

  1. Xác định Mã lỗi và Nguồn lỗi cho 500 Internal Server Error bằ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.
  2. Nếu Mã lỗi là protocol.http.BadPath và 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ệ.
  3. 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ố 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ệ.

  4. Xác định xem biến luồng target.url có 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à

    1. 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 (/).
    2. 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

    3. 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ệ.
    4. Xin lưu ý rằng target.url có 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ệ.

    Nhật ký

    Sử dụng nhật ký trong máy chủ nhật ký

    1. 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.url hay 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.
    2. Nếu bạn có nhật ký, hãy xem xét nhật ký và
      1. Xác minh xem target.url có đường dẫn không hợp lệ hay không, và
      2. 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

    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
  5. 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.url và xác định nguyên nhân khiến việc cập nhật target.url có đườ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.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: Biến target.url cập nhật Chính sách JavaScript

    var 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?json có trong một biến khác url.

    Xin lưu ý rằng giá trị của url có 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 Error với mã lỗi protocol.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 đề của yêu cầu

    var 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ó trong biến url và giá trị của một biến khác path, 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 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:

    • 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 Error với mã lỗi protocol.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 url có 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 Error với mã lỗi protocol.http.BadPath.

Độ 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:

  1. Đả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à luôn bắt đầu bằng dấu gạch chéo (/).
    1. 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 (/).
    2. 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ệ.
    3. 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ệ.
  2. 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.url cập nhật Chính sách JavaScript

    Sử dụng dấu gạch chéo (/) thay vì dấu chấm hỏi (?) trong biến url để 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.url dựa trên giá trị trong tiêu đề của yêu cầu

    var 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ụ: /user trong tiêu đề yêu cầu Path để 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.url

    Thê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ành https://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 path thà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 curl hoàn chỉnh được dùng để tái tạo 500 Internal Server Error bằng mã lỗi protocol.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_log

      Trong đó: 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

    Biến luồng – target