500 Dahili Sunucu Hatası - BadPath

Apigee Edge belgelerini görüntülüyorsunuz.
Apigee X belgelerine gidin.
bilgi

Belirti

İstemci uygulaması, API çağrılarına yanıt olarak 500 Internal Server Error HTTP durum kodunu ve protocol.http.BadPath hata kodunu alır.

Hata mesajı

İstemci uygulaması aşağıdaki yanıt kodunu alır:

HTTP/1.1 500 Internal Server Error

Ayrıca aşağıdaki hata mesajını da görebilirsiniz:

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

Olası nedenler

Bu hata, akış değişkeni target.url ile temsil edilen arka uç sunucusunun istek URL'si, eğik çizgi (/) yerine soru işareti (?) ile başlayan bir path içerdiğinde oluşur. Bu durum geçersizdir.

RFC 3986, bölüm 3: Söz Dizimi Bileşenleri ve RFC 3986, bölüm 3.3: Yol spesifikasyonlarına göre:

  1. URI söz dizimi aşağıdaki bileşenlere sahiptir:

            foo://example.com:8042/over/there?name=ferret#nose
            \_/   \______________/\_________/ \_________/ \__/
             |            |            |            |       |
          scheme      authority       path        query   fragment
    
  2. path bileşeni zorunludur ve her zaman eğik çizgiyle (/) başlamalıdır.

Bu nedenle, arka uç sunucusunun istek URL'sinde eğik çizgi (/) yerine soru işareti (?) ile başlayan bir path bileşeni varsa Apigee Edge, 500 Internal Server Error ve protocol.http.BadPath hata koduyla yanıt verir.

Örneğin: target.url değeri https://www.mocktarget.apigee.net?json ise path değeri eğik çizgi (/) yerine soru işaretiyle (?) başladığı için geçersiz olarak kabul edilir ve bu hata oluşur.

Neden Açıklama Aşağıdaki ürünler için geçerli sorun giderme talimatları
Arka uç sunucusu URL'si (target.url) geçersiz bir yol içeriyor Akış değişkeniyle target.url gösterilen arka uç sunucusu URL'sindeki yol bileşeni, sağa eğik çizgi (/) yerine soru işareti (?) ile başlıyor. Edge Public ve Private Cloud kullanıcıları

Sık karşılaşılan teşhis adımları

Bu hatayı teşhis etmek için aşağıdaki araçlardan/tekniklerden birini kullanın:

API Monitoring

1. Prosedür: API İzleme'yi kullanma

API İzleme'yi kullanarak hatayı teşhis etmek için:

  1. Apigee Edge kullanıcı arayüzünde oturum açın. Uygun bir role sahip bir kullanıcı olarak oturum açmanız gerekir.
  2. Sorunu incelemek istediğiniz kuruluşa geçin.

  3. Analyze > API Monitoring > Investigate (Analiz > API İzleme > İnceleme) sayfasına gidin.
  4. Hataları gözlemlediğiniz belirli zaman aralığını seçin.
  5. Hata Kodunu Zaman ile karşılaştırın.

  6. Aşağıda gösterildiği gibi, hata kodunu protocol.http.BadPath içeren bir hücre seçin:

  7. protocol.http.BadPath hata koduyla ilgili bilgiler aşağıda gösterildiği gibi görüntülenir:

  8. Günlükleri görüntüle 'yi tıklayın ve başarısız isteğin satırını genişletin.

  9. Günlükler penceresinde aşağıdaki ayrıntıları not edin:
    • Durum Kodu: 500
    • Hata Kaynağı: target
    • Hata Kodu: protocol.http.BadPath
  10. Hata Kaynağı target ve Hata Kodu protocol.http.BadPath ise bu, arka uç sunucusu URL'sinin geçersiz bir yola sahip olduğunu gösterir.

Trace

2. Prosedür: Trace aracını kullanma

İzleme aracını kullanarak hatayı teşhis etmek için:

  1. İzleme oturumunu etkinleştirin ve şunlardan birini yapın:
    • 500 Internal Server Error hatasının oluşmasını bekleyin veya
    • Sorunu yeniden oluşturabiliyorsanız sorunu yeniden oluşturmak için API çağrısı yapın. 500 Internal Server Error
  2. Tüm FlowInfo'ları göster'in etkinleştirildiğinden emin olun:

  3. Başarısız olan isteklerden birini seçip izlemeyi inceleyin.
  4. İzlemenin farklı aşamalarında gezinin ve hatanın nerede oluştuğunu bulun.
  5. Hatayı genellikle aşağıdaki gibi Hedef İstek Akışı Başlatıldı aşamasından sonraki bir akışta görürsünüz:

  6. İzlemeyle ilgili hatanın değerini not edin:

    hata: Geçersiz istek yolu

    Hata, Target Request Flow Started (Hedef İstek Akışı Başlatıldı) aşamasından sonra Apigee Edge tarafından oluşturulduğundan arka uç sunucusu URL'sinin geçersiz bir yola sahip olduğunu gösterir. Bu durum, Apigee Edge'deki target.url akış değişkeni (arka uç sunucusunun URL'sini temsil eder) hedef istek akışındaki politikalardan biri aracılığıyla geçersiz bir yolla güncellenmişse büyük olasılıkla ortaya çıkar.

  7. Her akışta Hedef İstek Akışı Başlatıldı aşamasına doğru hata akışından geriye doğru Okunan ve Atanan Değişkenler bölümünü inceleyin.
  8. Akış değişkeninin target.url was güncellendiği politikayı belirleyin:

    JavaScript politikasının akış değişkenini güncellediğini gösteren örnek izleme target.url:

    Yukarıda gösterilen örnek izlemede, akış değişkeni değişkeninin değerinin target.url , JS- SetTargetURL adlı JavaScript politikasında aşağıdaki şekilde güncellendiğini unutmayın: target.url : https://mocktarget.apigee.net?json

  9. target.url içindeki değerin aşağıdaki bileşenlere sahip olduğunu unutmayın:
    • şema: https
    • authority: mocktarget.apigee.net
    • path: ?json
  10. Yol bileşeni, öne eğik çizgi (/) yerine soru işaretiyle (?) başladığından Invalid request path hatasını alırsınız.
  11. İzleme işleminde AX (Analytics Verileri Kaydedildi) aşamasına gidin ve bu aşamayı tıklayın.
  12. Aşağıdaki gibi Phase Details - Error Headers (Aşama Ayrıntıları - Hata Başlıkları) bölümüne gidin ve X-Apigee-fault-code ile X-Apigee-fault-source değerlerini belirleyin:

  13. X-Apigee-fault-code ve X-Apigee-fault-source değerlerini sırasıyla protocol.http.BadPath ve target olarak görürsünüz. Bu, hatanın arka uç sunucusu URL'sinin geçersiz bir yola sahip olmasından kaynaklandığını gösterir.

    Yanıt başlıkları Değer
    X-Apigee-fault-code protocol.http.BadPath
    X-Apigee-fault-source target

NGINX

3. Prosedür: NGINX erişim günlüklerini kullanma

NGINX erişim günlüklerini kullanarak hatayı teşhis etmek için:

  1. Özel bulut kullanıcısıysanız HTTP 500 Internal Server Error ile ilgili temel bilgileri belirlemek için NGINX erişim günlüklerini kullanabilirsiniz.
  2. NGINX erişim günlüklerini kontrol edin:

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

  3. Belirli bir süre boyunca (sorun geçmişte yaşandıysa) 500 hata koduyla protocol.http.BadPath hata olup olmadığını veya 500 ile başarısız olan isteklerin olup olmadığını arayın.
  4. X-Apigee-fault-code'un protocol.http.BadPath değeriyle eşleşen 500 hataları bulursanız X-Apigee-fault-source değerini belirleyin.

    NGINX erişim günlüğünden örnek 500 hatası:

    NGINX erişim günlüğündeki yukarıdaki örnek girişte, X-Apigee- fault-code ve X-Apigee-fault-source: için aşağıdaki değerler bulunur:

    Üst bilgiler Değer
    X-Apigee-fault-code protocol.http.BadPath
    X-Apigee-fault-source target

    X-Apigee-fault-code ve X-Apigee-fault-source değerlerinin sırasıyla protocol.http.BadPath ve target olduğuna dikkat edin. Bu değerler, hatanın arka uç sunucusu URL'sinin geçersiz bir yola sahip olmasından kaynaklandığını gösterir.

Neden: Arka uç sunucusu URL'si (target.url) geçersiz bir yol içeriyor

Teşhis

  1. 500 Internal Server Error için Hata Kodunu ve Hata Kaynağını, Yaygın teşhis adımları bölümünde açıklandığı gibi API İzleme, İzleme Aracı veya NGINX erişim günlüklerini kullanarak belirleyin.
  2. Hata Kodu protocol.http.BadPath ise ve Hata Kaynağı target değerini içeriyorsa bu, arka uç sunucu URL'sinin geçersiz bir yola sahip olduğunu gösterir.
  3. Arka uç sunucusu URL'si, Apigee Edge'de target.url akış değişkeniyle gösterilir. Bu hata genellikle hedef istek akışındaki politikaların (proxy/paylaşılan akış içinde) herhangi birini kullanarak arka uç sunucusu URL'sini dinamik olarak güncellemeye çalıştığınızda ve URL'nin geçersiz bir yolu olduğunda oluşur (target.url).

  4. Aşağıdaki yöntemlerden birini kullanarak target.url akış değişkeninin gerçekten geçersiz bir yola sahip olup olmadığını ve değerinin kaynağını belirleyin:

    Trace

    Trace aracını kullanma

    Bu hata için bir iz yakaladıysanız İzleme aracını kullanma bölümünde açıklanan adımları uygulayın.

    1. target.url öğesinin geçersiz bir yola sahip olup olmadığını, yani eğik çizgi (/) yerine soru işareti (?) ile başlayıp başlamadığını doğrulayın.
    2. Evetse target.url değerini geçersiz bir yol içerecek şekilde değiştiren veya güncelleyen politikayı bulun.

      JavaScript politikasının akış değişkenini güncellediğini gösteren örnek izleme target.url

    3. Yukarıdaki örnek izlemede, JavaScript politikasının target.url değerini geçersiz bir yol içerecek şekilde değiştirdiğini veya güncellediğini unutmayın.
    4. target.url'ın aşağıdaki bileşenlere sahip olduğunu unutmayın:
      • şema: https
      • authority: mocktarget.apigee.net
      • path: ?json

      Yol, eğik çizgi (/) yerine soru işaretiyle (?) başlıyor, bu nedenle geçersiz.

    Günlükler

    Günlük sunucunuzdaki günlükleri kullanma

    1. Bu hatayla ilgili iziniz yoksa (aralıklı olarak görülen bir sorun) target.url akış değişkeninin değeriyle ilgili bilgileri MessageLogging veya ServiceCallout gibi politikaları kullanarak günlük sunucunuza kaydedip kaydetmediğinizi kontrol edin.
    2. Günlükleriniz varsa bunları inceleyin ve
      1. target.url öğesinin geçersiz bir yol içerip içermediğini doğrulayın.
      2. Hangi politikanın target.url öğesini geçersiz yol içerecek şekilde değiştirdiğini belirleyip belirleyemediğinizi kontrol edin.

    API proxy'si

    Başarısız olan API proxy'sini inceleme

    Bu hatayla ilgili izleme veya günlükleriniz yoksa akış değişkeni target.url'yı geçersiz bir yol içerecek şekilde değiştiren veya güncelleyen öğeyi belirlemek için başarısız olan API proxy'sini inceleyin. Aşağıdakileri kontrol edin:

    • API proxy'sindeki politika
    • Proxy'den çağrılan tüm paylaşılan akışlar
  5. Akış değişkenini target.url değiştiren veya güncelleyen politikayı (ör. AssignMessage veya JavaScript) dikkatlice inceleyin ve target.url değişkeninin geçersiz bir yola sahip olacak şekilde güncellenmesinin nedenini belirleyin.

    Aşağıda, akış değişkenini target.url yanlış şekilde güncelleyerek bu hataya yol açan geçersiz bir yol içermesine neden olan birkaç örnek politika verilmiştir.

    1. örnek

    1. örnek: JavaScript politikası target.url değişkenini güncelleme

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

    Yukarıdaki örnekte, akış değişkeni target.url değerinin başka bir değişkende (url.) bulunan https://mocktarget.apigee.net?json değeriyle güncellendiğini unutmayın.

    url değerinin aşağıdaki bileşenlere sahip olduğunu unutmayın:

    • şema: https
    • authority: mocktarget.apigee.net
    • path: ?json

    Yol, eğik çizgi (/) yerine soru işaretiyle (?) başlıyor , bu durum geçersizdir. Bu nedenle, Apigee Edge, 500 Internal Server Error ile protocol.http.BadPath hata kodunu döndürür.

    2. örnek

    2. örnek: İstek başlığındaki değere göre target.url değişkenini güncelleyen JavaScript politikası

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

    Yukarıdaki örnekte, akış değişkeni target.url değerinin, url değişkeninde bulunan https://mocktarget.apigee.net değeri ve request.header.Path. öğesinden alınan path değişkeninin değeri birleştirilerek güncellendiğini unutmayın.

    Gerçek isteğe veya izlemeye erişiminiz varsa request.header.Path'ya iletilen gerçek değeri doğrulayabilirsiniz.

    Kullanıcı tarafından yapılan örnek istek

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

    Bu örnekte, üstbilgi yolu istek kapsamında gönderilmez. Bu nedenle, JavaScript politikasındaki path değişkeninin değeri null olur.

    Bu durumda:

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

    target.url değerinin aşağıdaki bileşenlere sahip olduğunu unutmayın:

    • şema: https
    • authority: mocktarget.apigee.net
    • path: ?user

    Yol, eğik çizgi (/) yerine soru işaretiyle (?) başlıyor , bu durum geçersizdir. Bu nedenle, Apigee Edge, 500 Internal Server Error hata koduyla protocol.http.BadPath değerini döndürür.

    3. örnek

    3. örnek: AssignMessage politikası target.url değişkenini güncelleme

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

    url değerinin aşağıdaki bileşenlere sahip olduğunu unutmayın:

    • şema: https
    • authority: mocktarget.apigee.net
    • path: ?echo

    Bu örnekte de yol, eğik çizgi (/) yerine soru işaretiyle (?) başlıyor, bu da geçersizdir. Bu nedenle, Apigee Edge, 500 Internal Server Error hata koduyla protocol.http.BadPath değerini döndürür.

Çözünürlük

URL spesifikasyonu RFC 3986, bölüm 3: Söz Dizimi Bileşenleri uyarınca path bileşeni zorunludur ve her zaman "/" ile başlamalıdır. Bu sorunu düzeltmek için aşağıdaki adımları uygulayın:

  1. Akış değişkeni target.url ile gösterilen arka uç sunucusu URL'sinin her zaman geçerli bir yola sahip olduğundan ve her zaman eğik çizgi (/) ile başladığından emin olun.
    1. Bazı durumlarda yolda kaynak adı olmayabilir. Bu durumda, yolun en azından düz eğik çizgi (/) içerdiğinden emin olun.
    2. Akış değişkeninin değerini belirlemek için başka değişkenler kullanıyorsanız target.url, diğer değişkenlerin geçersiz bir yola sahip olmadığından emin olun.
    3. Akış değişkeninin değerini belirlemek için herhangi bir dize işlemi gerçekleştirirseniz target.url, dize işlemlerinin sonucunun veya sonucunun geçersiz bir yol içermediğinden emin olun.
  2. Yukarıda bahsedilen örneklerde bu sorunu aşağıdaki şekilde düzeltebilirsiniz:

    1. örnek

    1. örnek: JavaScript politikası target.url değişkenini güncelleme

    Bu sorunu düzeltmek için aşağıdaki örnekte gösterildiği gibi, url değişkeninde soru işareti (?) yerine eğik çizgi (/) kullanın:

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

    2. örnek

    2. örnek: İstek başlığındaki değere göre target.url değişkenini güncelleyen JavaScript politikası

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

    Aşağıda gösterildiği gibi bu sorunu düzeltmek için istek başlığının bir parçası olarak geçerli bir yol (ör. /user) ilettiğinizden emin olun: Path

    Örnek İstek:

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

    3. örnek

    3. örnek: AssignMessage politikası target.url değişkenini güncelliyor

    AssignMessage politikasının <Value> öğesine geçerli bir yol ekleyin. Yani, soru işaretini (?) <Value> öğesinde eğik çizgiyle (/) değiştirin ve bu sorunu düzeltmek için aşağıda gösterildiği gibi https://mocktarget.apigee.net/echo olarak ayarlayın:

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

    Spesifikasyon

    Apigee Edge, arka uç sunucusu URL'sindeki path bileşenin aşağıdaki özelliklere göre her zaman eğik çizgiyle (/) başlamasını bekler:

    Spesifikasyon
    RFC 3986, bölüm 3: Söz Dizimi Bileşenleri
    RFC 3986, bölüm 3.3: Yol

    Hâlâ Apigee Destek Ekibi'nden yardıma ihtiyacınız varsa Toplanması gereken teşhis bilgileri başlıklı makaleyi inceleyin.

    Teşhis bilgilerini toplamalıdır

    Yukarıdaki talimatları uyguladıktan sonra sorun devam ederse aşağıdaki teşhis bilgilerini toplayın ve Apigee Edge Destek Ekibi ile iletişime geçin:

    Herkese açık bulut kullanıcısıysanız aşağıdaki bilgileri sağlayın:

    • Kuruluş adı
    • Ortam adı
    • API proxy'sinin adı
    • 500 Internal Server Error öğesini protocol.http.BadPath hata koduyla yeniden oluşturmak için kullanılan curl komutunun tamamı
    • API istekleri için izleme dosyası

    Private Cloud kullanıcısıysanız aşağıdaki bilgileri sağlayın:

    • Başarısız olan istekler için gözlemlenen hata mesajının tamamı
    • Ortam adı
    • API proxy paketi
    • API istekleri için izleme dosyası
    • NGINX erişim günlükleri:

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

      Nerede: ORG, ENV ve PORT# değerlerinin yerine gerçek değerler girilir.

    • Mesaj İşleyici sistem günlükleri /opt/apigee/var/log/edge-message- processor/logs/system.log

    Referanslar

    Akış değişkenleri - hedef