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 protocol.http.BadPath hata koduyla birlikte 500 Internal Server Error HTTP durum 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, arka uç sunucusunun akış değişkeni target.url ile temsil edilen istek URL'sinde, geçersiz düz eğik çizgi (/) yerine soru işareti (?) ile başlayan bir path içeriyorsa ortaya çıkar.

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. Bu bileşen, her zaman bir öne eğik çizgi (/) ile başlamalı ve olmalıdır.

Bu nedenle, arka uç sunucusunun istek URL'sinde öne 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, https://www.mocktarget.apigee.net?json değerine sahipse bu hata,eğik çizgi (/) yerine soru işareti (?) ile başladığından geçersiz olarak ortaya çıkar.path

Neden Açıklama Şunun için geçerli sorun giderme talimatları:
Arka uç sunucu URL'si (target.url) geçersiz bir yola sahip target.url akış değişkeniyle temsil edilen arka uç sunucu URL'sindeki yol bileşeni, öne eğik çizgi (/) yerine soru işaretiyle (?) başlar. Edge Herkese Açık ve Özel Bulut kullanıcıları

Yaygın 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 Monitoring'i Kullanma

API Monitoring'i kullanarak hatayı teşhis etmek için:

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

  3. Analiz > API İzleme > Araştır sayfasına gidin.
  4. Hataları gözlemlediğiniz belirli zaman aralığını seçin.
  5. Hata Kodu'nu Zamana göre çizin.

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

  7. protocol.http.BadPath hata kodu ile ilgili bilgi 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ı dikkate alın:
    • Durum Kodu: 500
    • Hata Kaynağı: target
    • Hata Kodu: protocol.http.BadPath
  10. Hata Kaynağı target ve Hata Kodu protocol.http.BadPath ise bu durum arka uç sunucu URL'sinin geçersiz bir yola sahip olduğunu gösterir.

Trace

2. Prosedür: İzleme aracını kullanma

Hatayı İzle aracını kullanarak teşhis etmek için:

  1. İzleme oturumunu ve aşağıdakilerden birini etkinleştirin:
    • 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 seçeneğinin etkin olduğundan emin olun:

  3. Başarısız isteklerden birini seçip izi inceleyin.
  4. İzin farklı aşamaları arasında gezinin ve hatanın nerede gerçekleştiğini bulun.
  5. Hatayı genellikle aşağıda gösterildiği gibi Hedef İstek Akışı Başlatıldı aşamasından sonraki bir akışta bulabilirsiniz:

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

    hata: Geçersiz istek yolu

    Hata, Hedef İstek Akışı Başlatıldı aşamasından sonra Apigee Edge tarafından bildirildiği için arka uç sunucu URL'sinin geçersiz bir yola sahip olduğu anlamına gelir. Bu durum büyük olasılıkla 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üncellendiğinde ortaya çıkar.

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

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

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

  9. target.url öğesindeki değerin aşağıdaki bileşenlere sahip olduğunu unutmayın:
    • şema: https
    • yetkili: mocktarget.apigee.net
    • yol: ?json
  10. path bileşeni öne eğik çizgi (/) yerine bir soru işareti (?) ile başladığından Invalid request path hatasını alırsınız.
  11. İzdeki AX (Analytics Data Recorded) Aşamalı Sunumu'na gidin ve bunu tıklayın.
  12. Aşama Ayrıntıları - Hata Başlıkları bölümüne ilerleyin ve X-Apigee-fault-code ile X-Apigee-fault-source değerlerini aşağıda gösterildiği gibi 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 durum, arka uç sunucu URL'sinin geçersiz bir yola sahip olduğundan bu hataya yol açtığı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. Private Cloud kullanıcısıysanız HTTP 500 Internal Server Error ile ilgili önemli 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 protocol.http.BadPath hata koduna sahip 500 hatası olup olmadığını (sorun geçmişte gerçekleştiyse) veya 500 nedeniyle başarısız olmaya devam eden bir istek olup olmadığını görmek için arama yapın.
  4. X-Apigee-fault-code değeriyle eşleşen X-Apigee-fault-code özelliğinde 500 hatası bulursanız X-Apigee-fault-code değerinin değerini belirleyin.

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

    NGINX erişim günlüğünden yukarıdaki örnek giriş, X-Apigee- hata kodu ve X-Apigee-fault-source için aşağıdaki değerlere sahiptir:

    Ü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 oldığına dikkat edin. Bu hata, arka uç sunucu URL'sinde geçersiz bir yola sahip olduğu için ortaya çıkar.

Neden: Arka uç sunucusu URL'si (target.url) geçersiz bir yola sahip

Teşhis

  1. Yaygın teşhis adımları bölümünde açıklandığı şekilde API İzleme, İzleme Aracı veya NGINX erişim günlüklerini kullanarak 500 Internal Server Error için Hata Kodu ve Hata Kaynağı'nı belirleyin.
  2. Hata Kodu protocol.http.BadPath ise ve Hata Kaynağı target değerine sahipse bu durum, 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 temsil edilir. Bu hata genellikle arka uç sunucu URL'sini (target.url) dinamik olarak, Hedef istek akışındaki politikalardan herhangi birini (proxy/paylaşılan akış içinde) kullanarak ve geçersiz yola sahip olacak şekilde güncellemeye çalışırsanız ortaya çıkar.

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

    Trace

    İzleme 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 yolunda geçersiz bir yol olup olmadığını kontrol edin. Yolun öne eğik çizgi (/) yerine soru işaretiyle (?) başlayıp başlamadığını kontrol edin.
    2. Yanıtınız evet ise target.url değerini geçersiz bir yol içerecek şekilde değiştiren veya güncelleyen politikayı öğrenin.

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

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

      Yol, eğik çizgi (/) yerine bir soru işareti (?) ile başlıyor. Bu nedenle geçersizdir.

    Günlükler

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

    1. Bu hatayla ilgili bir iz yoksa (aralıklı bir sorun) günlük sunucunuza MessageLogging veya ServiceDescription politikası gibi politikalar kullanarak target.url akış değişkeninin değeriyle ilgili bilgileri günlüğe kaydedip kaydetmediğinizi kontrol edin.
    2. Günlükleriniz varsa bunları inceleyin ve
      1. target.url yolunun geçersiz olup olmadığını doğrulayın ve
      2. target.url politikasında geçersiz bir yol içerecek şekilde hangi politikanın değiştirildiği hakkındaki bilgileri belirleyip belirleyemediğinize bakın

    API proxy'si

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

    Bu hatayla ilgili bir iz veya günlüğünüz yoksa target.url akış değişkeninin geçersiz yol içerecek şekilde değiştirildiği veya güncellendiğini belirlemek için başarısız 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. target.url akış değişkenini değiştiren veya güncelleyen ve target.url öğesinin geçersiz yol olarak güncellenmesinin nedenini belirleyen politikayı (ör. AtaMessage veya JavaScript) dikkatlice inceleyin.

    target.url akış değişkenini, bu hataya yol açan geçersiz bir yol içerecek şekilde yanlış güncelleyen birkaç örnek politikayı aşağıda bulabilirsiniz.

    1. Örnek

    1. Örnek: JavaScript Politikası target.url değişkenini güncelliyor

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

    Yukarıdaki örnekte, target.url akış değişkeninin, url. adlı başka bir değişkende yer alan https://mocktarget.apigee.net?json değeriyle güncellendiğine dikkat edin

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

    • şema: https
    • yetkili: mocktarget.apigee.net
    • yol: ?json

    Yol, geçersiz olduğu için düz eğik çizgi (/) yerine bir soru işareti (?) ile başlar. Bu nedenle Apigee Edge, protocol.http.BadPath hata koduyla 500 Internal Server Error değerini döndürür.

    Örnek 2

    2. Örnek: JavaScript Politikası, target.url değişkenini istek başlığındaki değere göre güncelliyor

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

    Yukarıdaki örnekte, target.url akış değişkeninin, bir değişkende yer alan https://mocktarget.apigee.net değeri ile url değeri request.header.Path. kaynağından alınan başka bir değişkenin (path) değeri birleştirilerek güncellendiğine dikkat edin.

    Asıl isteğe veya ize erişiminiz varsa request.header.Path öğesine iletilen gerçek değeri doğrulayabilirsiniz.

    Kullanıcı tarafından gönderilen örnek istek

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

    Bu örnekte başlık yolu, isteğin bir parçası olarak gönderilmez. Dolayısıyla, 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
    • yetkili: mocktarget.apigee.net
    • yol: ?user

    Yol, geçersiz olduğu için düz eğik çizgi (/) yerine bir soru işareti (?) ile başlar. Bu nedenle Apigee Edge, protocol.http.BadPath hata koduyla 500 Internal Server Error değerini döndürür.

    Örnek 3

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

    <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
    • yetkili: mocktarget.apigee.net
    • yol: ?echo

    Yine bu örnekte yol, eğik çizgi (/), bu geçersiz yerine bir soru işaretiyle (?) başlar. Bu nedenle Apigee Edge, 500 Internal Server Error hatasını protocol.http.BadPath hata koduyla 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. Dolayısıyla, bu sorunu düzeltmek için aşağıdaki adımları uygulayın:

  1. target.url akış değişkeniyle temsil edilen arka uç sunucusu URL'sinin her zaman geçerli bir yola sahip olduğundan ve her zaman eğik çizgiyle (/) başladığından emin olun.
    1. Bazı durumlarda, yolda kaynak adınız olmayabilir. Daha sonra yolda en azından bir öne eğik çizgi (/) bulunduğundan emin olun.
    2. Akış değişkeninin target.url değerini belirlemek için başka değişkenler kullanıyorsanız diğer değişkenlerin geçersiz yol bulunmadığından emin olun.
    3. target.url akış değişkeninin değerini belirlemek için dize işlemi gerçekleştiriyorsanız dize işlemlerinin sonucunun veya sonucunun geçersiz yol olmadığından emin olun.
  2. Yukarıda açıklanan örneklerde bu sorunu aşağıda açıklandığı şekilde düzeltebilirsiniz:

    1. Örnek

    1. Örnek: JavaScript Politikası target.url değişkenini güncelliyor

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

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

    Örnek 2

    2. Örnek: JavaScript Politikası, target.url değişkenini istek başlığındaki değere göre güncelliyor

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

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

    Örnek İstek:

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

    Örnek 3

    3. Örnek: AttributionMessage Politikası, target.url değişkenini güncelliyor

    AtaMessage politikasının <Value> öğesine geçerli bir yol ekleyin. Yani <Value> öğesinde soru işaretini (?) öne 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 spesifikasyonlara göre her zaman öne eğik çizgi (/) ile başlaması GEREKİR:

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

    Apigee Desteği'nden hâlâ yardıma ihtiyacınız varsa Teşhis bilgilerini toplamanız gerekiyor bölümünü inceleyin.

    Teşhis bilgileri toplanmalıdır

    Yukarıdaki talimatları uygulamanıza rağmen sorun devam ederse aşağıdaki teşhis bilgilerini toplayıp 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'si adı
    • 500 Internal Server Error dosyasını protocol.http.BadPath hata koduyla yeniden oluşturmak için kullanılan curl komutunu tamamlayın
    • API istekleri için izleme dosyası

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

    • Başarısız istekler için gözlemlenen tam hata mesajı
    • 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

      Yer: ORG, ENV ve PORT# gerçek değerlerle değiştirilir.

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

    Referanslar

    Akış Değişkenleri - hedef