Error Server Internal 500 - BadPath

Anda sedang melihat dokumentasi Apigee Edge.
Buka Dokumentasi Apigee X.
info

Gejala

Aplikasi klien mendapatkan kode status HTTP 500 Internal Server Error dengan kode error protocol.http.BadPath sebagai respons untuk panggilan API.

Pesan error

Aplikasi klien mendapatkan kode respons berikut:

HTTP/1.1 500 Internal Server Error

Selain itu, Anda mungkin melihat pesan error berikut:

{
   "fault":{
      "faultstring":"Invalid request path",
      "detail":{
         "errorcode":"protocol.http.BadPath"
      }
   }
}

Kemungkinan penyebab

Error ini terjadi jika URL permintaan server backend, diwakili oleh variabel alur target.url, berisi path yang dimulai dengan tanda tanya (?) dari garis miring (/), yang tidak valid.

Sesuai dengan spesifikasi RFC 3986, bagian 3: Komponen Sintaksis dan RFC 3986, bagian 3.3: Jalur:

  1. Sintaksis URI memiliki komponen berikut:

            foo://example.com:8042/over/there?name=ferret#nose
            \_/   \______________/\_________/ \_________/ \__/
             |            |            |            |       |
          scheme      authority       path        query   fragment
    
  2. Komponen path wajib dan HARUS diawali dengan dan selalu tambahkan garis miring ke depan (/).

Oleh karena itu, jika URL permintaan server backend memiliki komponen path yang dimulai dengan tanda tanya (?), bukan garis miring (/), kemudian Apigee Edge merespons dengan 500 Internal Server Error dan kode error protocol.http.BadPath.

Misalnya: Jika target.url memiliki nilai https://www.mocktarget.apigee.net?json, error ini akan terjadi sebagai path dinyatakan tidak valid, karena diawali dengan tanda tanya (?) bukan garis miring ke depan (/).

Penyebab Deskripsi Petunjuk pemecahan masalah berlaku untuk
URL server backend (target.url) memiliki jalur yang tidak valid Komponen jalur di URL server backend yang diwakili oleh variabel alur target.url dimulai dengan tanda tanya (?), bukan tanda maju garis miring (/). Pengguna Edge Public dan Private Cloud

Langkah-langkah diagnosis umum

Gunakan salah satu alat/teknik berikut untuk mendiagnosis error ini:

Pemantauan API

Prosedur #1: Menggunakan Pemantauan API

Untuk mendiagnosis error menggunakan Pemantauan API:

  1. Login ke UI Apigee Edge sebagai pengguna dengan peran yang sesuai.
  2. Beralihlah ke organisasi tempat Anda ingin menyelidiki masalah tersebut.

  3. Buka Analyze > Pemantauan API > Investigasi.
  4. Pilih jangka waktu tertentu saat Anda melihat error.
  5. Gambarkan Kode Kesalahan terhadap Waktu.

  6. Pilih sel dengan kode kesalahan protocol.http.BadPath seperti yang ditunjukkan di bawah ini:

  7. Informasi tentang kode kesalahan protocol.http.BadPath ditampilkan sebagai yang ditampilkan di bawah ini:

  8. Klik Lihat log , lalu luaskan baris untuk permintaan yang gagal.

  9. Dari jendela Logs, perhatikan detail berikut:
    • Kode Status: 500
    • Sumber Kesalahan: target
    • Kode Kesalahan: protocol.http.BadPath
  10. Jika Sumber Kesalahan adalah target dan Kode Kesalahan adalah protocol.http.BadPath, hal ini menunjukkan bahwa URL server backend memiliki jalur tidak valid.

Trace

Prosedur #2: Menggunakan alat Rekaman Aktivitas

Untuk mendiagnosis error menggunakan alat Trace:

  1. Aktifkan sesi rekaman aktivitas dan
    • Tunggu hingga error 500 Internal Server Error terjadi, atau
    • Jika Anda dapat mereproduksi masalah, lakukan panggilan API untuk mereproduksi masalah 500 Internal Server Error
  2. Pastikan Tampilkan semua FlowInfos diaktifkan:

  3. Pilih salah satu permintaan yang gagal dan periksa rekaman aktivitasnya.
  4. Menavigasi melalui berbagai fase pelacakan dan menemukan tempat terjadinya kegagalan.
  5. Anda akan menemukan error ini biasanya dalam alur setelah Alur Permintaan Target Dimulai seperti yang ditunjukkan di bawah ini:

  6. Perhatikan nilai error dari trace:

    error: Jalur permintaan tidak valid

    Karena error dimunculkan oleh Apigee Edge setelah Alur Permintaan Target Dimulai Hal ini menunjukkan bahwa URL server backend memiliki jalur tidak valid. Ini akan kemungkinan besar terjadi jika variabel alur target.url (yang mewakili URL untuk server backend) di Apigee Edge mungkin telah diperbarui dengan jalur yang tidak valid melalui salah satu kebijakan dalam alur permintaan target.

  7. Periksa bagian Variabel Dibaca dan Ditetapkan di setiap alur secara mundur dari alur error menuju fase Alur Permintaan Target Dimulai.
  8. Tentukan kebijakannya, tempat variabel alur target.url berada diperbarui:

    Contoh rekaman aktivitas yang menunjukkan kebijakan JavaScript memperbarui variabel alur target.url:

    Dalam contoh trace yang ditampilkan di atas, perhatikan nilai variabel variabel flow target.url diperbarui dalam kebijakan JavaScript bernama JS- SetTargetURL sebagai berikut: target.url : https://mocktarget.apigee.net?json

  9. Perhatikan bahwa nilai dalam target.url memiliki komponen berikut:
    • skema: https
    • otoritas: mocktarget.apigee.net
    • jalur: ?json
  10. Karena komponen path dimulai dengan tanda tanya (?) bukan garis miring (/), Anda akan mendapatkan error Invalid request path.
  11. Buka Fase AX (Data Analytics Direkam) di rekaman aktivitas, lalu klik Fase tersebut.
  12. Scroll ke bawah ke bagian Detail Fase - Header Error, lalu tentukan X-Apigee-fault-code dan X-Apigee-fault-source seperti yang ditunjukkan di bawah ini:

  13. Anda akan melihat nilai X-Apigee-fault-code dan X-Apigee-fault-source masing-masing protocol.http.BadPath dan target , menunjukkan bahwa error ini disebabkan karena URL server backend memiliki jalur yang tidak valid.

    Header respons Nilai
    X-Apigee-fault-code protocol.http.BadPath
    X-Apigee-fault-source target

NGINX

Prosedur #3: Menggunakan log akses NGINX

Untuk mendiagnosis error menggunakan log akses NGINX:

  1. Jika Anda adalah pengguna Private Cloud, Anda dapat menggunakan log akses NGINX untuk menentukan informasi penting tentang HTTP 500 Internal Server Error.
  2. Periksa log akses NGINX:

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

  3. Telusuri apakah ada 500 error dengan kode error protocol.http.BadPath selama durasi tertentu (jika masalah terjadi di sudah lewat) atau jika ada permintaan yang masih gagal dengan 500.
  4. Jika Anda menemukan error 500 dengan pencocokan X-Apigee-fault-code nilai protocol.http.BadPath, lalu tentukan nilai X- Apigee-fault-source.

    Contoh error 500 dari log akses NGINX:

    Contoh entri di atas dari log akses NGINX memiliki nilai berikut untuk X-Apigee- fault-code dan X-Apigee-fault-source:

    Header Nilai
    X-Apigee-fault-code protocol.http.BadPath
    X-Apigee-fault-source target

    Perhatikan bahwa nilai X-Apigee-fault-code dan X-Apigee-fault-source adalah protocol.http.BadPath dan target , yang menunjukkan bahwa error ini disebabkan karena URL server backend memiliki jalur tidak valid.

Penyebab: URL server backend (target.url) memiliki jalur yang tidak valid

Diagnosis

  1. Tentukan Fault Code dan Fault Source untuk 500 Internal Server Error menggunakan Pemantauan API, Trace Tool, atau log akses NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
  2. Jika Kode Kesalahan adalah protocol.http.BadPath dan Sumber Kesalahan memiliki nilai target, maka ini menunjukkan bahwa URL server backend memiliki URL tidak valid jalur.
  3. URL server backend direpresentasikan oleh variabel alur target.url di Apigee Edge. Error ini biasanya terjadi jika Anda mencoba mengupdate URL server backend (target.url) secara dinamis menggunakan salah satu kebijakan (dalam proxy/alur bersama) di alur permintaan Target, sehingga memiliki jalur yang tidak valid.

  4. Tentukan apakah variabel flow target.url memang memiliki tidak valid path dan sumber untuk nilainya menggunakan salah satu metode berikut:

    Trace

    Menggunakan alat Trace

    Jika Anda telah merekam aktivitas error ini, gunakan langkah-langkah seperti yang dijelaskan di Menggunakan alat Trace dan

    1. Verifikasi apakah target.url memiliki jalur yang tidak valid, yaitu jika dimulai dengan tanda tanya (?), bukan garis miring (/).
    2. Jika ya, maka cari tahu kebijakan yang mengubah atau memperbarui nilai target.url untuk memuat jalur yang tidak valid.

      Contoh rekaman aktivitas yang menunjukkan kebijakan JavaScript memperbarui variabel alur target.url

    3. Dalam contoh rekaman aktivitas di atas, perhatikan bahwa kebijakan JavaScript telah mengubah atau memperbarui nilai target.url agar berisi jalur yang tidak valid.
    4. Perhatikan bahwa target.url memiliki komponen berikut:
      • skema: https
      • otoritas: mocktarget.apigee.net
      • jalur: ?json

      Jalur dimulai dengan tanda tanya (?), bukan tanda maju garis miring (/), sehingga tidak valid.

    Log

    Menggunakan log di server log Anda

    1. Jika tidak ada trace untuk error ini (masalah yang terputus-putus), periksa apakah Anda telah mencatat informasi tentang nilai variabel {i>flow<i} target.url, menggunakan kebijakan seperti MessageLogging atau ServiceInfo ke server log Anda.
    2. Jika Anda memiliki log, tinjau dan
      1. Verifikasi apakah target.url memiliki jalur yang tidak valid, dan
      2. Lihat apakah Anda dapat menentukan informasi tentang kebijakan yang diubah target.url berisi jalur yang tidak valid

    Proxy API

    Meninjau proxy API yang gagal

    Jika Anda tidak memiliki trace atau log untuk error ini, tinjau API yang gagal proxy untuk menentukan apa yang mengubah atau memperbarui variabel alur target.url berisi jalur yang tidak valid. Periksa hal-hal berikut:

    • Kebijakan dalam proxy API
    • Setiap alur bersama yang dipanggil dari proxy
  5. Periksa kebijakan tertentu dengan cermat (Misalnya: Menetapkan Pesan atau JavaScript) yang mengubah atau memperbarui variabel flow target.url dan menentukan penyebab memperbarui target.url agar memiliki jalur tidak valid.

    Berikut beberapa contoh kebijakan yang memperbarui variabel alur target.url secara keliru memuat jalur tidak valid yang mengarah ke {i>error<i} ini.

    Contoh #1

    Contoh #1: Kebijakan JavaScript memperbarui variabel target.url

    var url = "https://mocktarget.apigee.net?json"
    context.setVariable("target.url", url);
    

    Dalam contoh di atas, perhatikan bahwa variabel alur target.url telah diperbarui dengan nilai https://mocktarget.apigee.net?json yang ada di variabel url.

    Perhatikan bahwa nilai url memiliki komponen berikut:

    • skema: https
    • otoritas: mocktarget.apigee.net
    • jalur: ?json

    Jalur dimulai dengan tanda tanya (?), bukan garis miring (/), yang tidak valid. Oleh karena itu, Apigee Edge menampilkan 500 Internal Server Error dengan kode error protocol.http.BadPath.

    Contoh #2

    Contoh #2: Kebijakan JavaScript memperbarui variabel target.url berdasarkan nilai di header permintaan

    var path = context.getVariable("request.header.Path");
    var url = "https://mocktarget.apigee.net" + path
    context.setVariable("target.url", url);
    

    Dalam contoh di atas, perhatikan bahwa variabel alur target.url diperbarui dengan menggabungkan nilai https://mocktarget.apigee.net yang terdapat dalam variabel url dan nilai variabel lain path, yang nilainya diambil dari request.header.Path.

    Jika memiliki akses ke permintaan atau trace yang sebenarnya, Anda dapat memverifikasi nilai sebenarnya diteruskan ke request.header.Path.

    Contoh Permintaan yang dibuat oleh pengguna

    curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: ?user"
    

    Dalam contoh ini, jalur header tidak dikirim sebagai bagian dari permintaan. Oleh karena itu, nilai dari variabel path dalam kebijakan JavaScript adalah null.

    Jadi:

    • url = https://mocktarget.apigee.net + path
    • url = https://mocktarget.apigee.net + "?user"
    • target.url = https://mocktarget.apigee.net?user

    Perhatikan bahwa nilai target.url memiliki komponen berikut:

    • skema: https
    • otoritas: mocktarget.apigee.net
    • jalur: ?user

    Jalur dimulai dengan tanda tanya (?), bukan garis miring (/), yang tidak valid. Oleh karena itu, Apigee Edge menampilkan 500 Internal Server Error dengan kode error protocol.http.BadPath.

    Contoh #3

    Contoh #3: Kebijakan MenetapkanMessage memperbarui variabel 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>
    

    Perhatikan bahwa nilai url memiliki komponen berikut:

    • skema: https
    • otoritas: mocktarget.apigee.net
    • jalur: ?echo

    Sekali lagi di contoh ini, jalur dimulai dengan tanda tanya (?) bukan garis miring ke depan (/), yang tidak valid. Oleh karena itu, Apigee Edge menampilkan 500 Internal Server Error dengan kode error protocol.http.BadPath.

Resolusi

Sesuai dengan spesifikasi URL RFC 3986, bagian 3: Komponen Sintaksis, komponen path diperlukan dan HARUS selalu diawali dengan "/". Jadi, ikuti langkah-langkah di bawah ini untuk menyelesaikan masalah ini:

  1. Pastikan URL server backend, yang diwakili oleh variabel alur target.url selalu memiliki jalur yang valid dan selalu dimulai dengan garis miring ke depan (/).
    1. Dalam beberapa kasus, Anda mungkin tidak memiliki nama resource di jalur, lalu pastikan bahwa jalur setidaknya memiliki garis miring (/).
    2. Jika Anda menggunakan variabel lain untuk menentukan nilai variabel alur target.url, lalu pastikan variabel lain tidak memiliki jalur tidak valid.
    3. Jika Anda melakukan operasi string apa pun untuk menentukan nilai variabel flow target.url, lalu pastikan bahwa hasil atau hasil string operasi tidak memiliki jalur tidak valid.
  2. Dalam contoh yang dibahas di atas, Anda dapat memperbaiki masalah ini seperti yang dijelaskan di bawah:

    Contoh #1

    Contoh #1: Kebijakan JavaScript memperbarui variabel target.url

    Gunakan garis miring (/), bukan tanda tanya (?) di bagian variabel url untuk memperbaiki masalah ini seperti yang ditunjukkan di bawah ini:

    var url = "https://mocktarget.apigee.net/json"
    context.setVariable("target.url", url);
    

    Contoh #2

    Contoh #2: Kebijakan JavaScript memperbarui variabel target.url berdasarkan nilai di header permintaan

    var path = context.getVariable("request.header.Path");
    var url = "https://mocktarget.apigee.net" + path
    context.setVariable("target.url", url);
    

    Pastikan Anda meneruskan jalur yang valid, misalnya: /user sebagai bagian dari permintaan header Path untuk memperbaiki masalah ini seperti yang ditunjukkan di bawah:

    Contoh Permintaan:

    curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /user"
    

    Contoh #3

    Contoh #3: Kebijakan MenetapkanMessage memperbarui variabel target.url

    Tambahkan jalur yang valid di elemen <Value> kebijakan MenetapkanMessage. Artinya, ganti tanda tanya (?) dengan garis miring ke depan (/) di elemen <Value> dan tetapkan ke https://mocktarget.apigee.net/echo untuk memperbaiki masalah seperti yang ditunjukkan di bawah ini:

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

    Spesifikasi

    Apigee Edge mengharapkan bahwa path komponen di URL server backend HARUS selalu diawali dengan garis miring (/) sesuai dengan hal berikut spesifikasi:

    Spesifikasi
    RFC 3986, bagian 3: Komponen Sintaksis
    RFC 3986, bagian 3.3: Jalur

    Jika Anda masih memerlukan bantuan dari Dukungan Apigee, buka Harus mengumpulkan diagnostik.

    Harus mengumpulkan informasi diagnostik

    Jika masalah berlanjut bahkan setelah mengikuti instruksi di atas, kumpulkan informasi diagnostik, lalu hubungi Dukungan Apigee Edge:

    Jika Anda adalah pengguna Cloud Publik, berikan informasi berikut:

    • Nama organisasi
    • Nama lingkungan
    • Nama proxy API
    • Menyelesaikan perintah curl yang digunakan untuk mereproduksi 500 Internal Server Error dengan kode error protocol.http.BadPath
    • File rekaman aktivitas untuk permintaan API

    Jika Anda adalah pengguna Private Cloud, berikan informasi berikut:

    • Pesan error lengkap yang diamati untuk permintaan yang gagal
    • Nama lingkungan
    • Paket proxy API
    • File rekaman aktivitas untuk permintaan API
    • Log akses NGINX:

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

      Di mana: ORG, ENV, dan PORT# diganti dengan nilai aktual.

    • Log sistem Pemroses Pesan /opt/apigee/var/log/edge-message- processor/logs/system.log

    Referensi

    Variabel Alur - target