500 Dahili Sunucu Hatası - BlankPath

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.EmptyPath 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":"Request path cannot be empty",
      "detail":{
         "errorcode":"protocol.http.EmptyPath"
      }
   }
}

Olası nedenler

Bu hata, akış değişkeni target.url ile temsil edilen arka uç sunucusunun istek URL'si boş bir yol içerdiğinde oluşur.

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 yolda başka karakter olmasa bile her zaman eğik çizgi (/) içermelidir.

Bu nedenle, arka uç sunucusunun istek URL'sinde path bileşeni hiç yoksa, yani eğik çizgi (/) bile yoksa Apigee Edge, 500 Internal Server Error ve hata kodu protocol.http.EmptyPath ile yanıt verir.

Örneğin: target.url değeri https://www.mocktarget.apigee.net ise path bileşeni boş veya eksik olduğundan bu hata oluşur.

Neden Açıklama Aşağıdaki ürünler için geçerli sorun giderme talimatları
Arka uç sunucusu URL'sinin (target.url) yolu boş Akış değişkeni target.url ile temsil edilen arka uç sunucusu URL'sinin yolu boş. 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. Oturum açarken uygun bir rol kullanın.
  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.EmptyPath içeren bir hücre seçin:

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

  8. Başarısız olan isteğin satırını genişletmek için Günlükleri görüntüle 'yi tıklayın.

  9. Günlükler penceresinde aşağıdaki ayrıntıları not edin:
    • Durum Kodu: 500
    • Hata Kaynağı: target
    • Hata Kodu: protocol.http.EmptyPath
  10. Hata Kaynağı target ve Hata Kodu protocol.http.EmptyPath ise bu, arka uç sunucusu URL'sinin boş 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 örnekte gösterildiği gibi Hedef İstek Akışı Başlatıldı aşamasından sonraki bir akışta görürsünüz:

  6. İzden hatanın değerini not edin.

    error: Request path cannot be empty (hata: İstek yolu boş olamaz)

    Hata, Target Request Flow Started (Hedef İstek Akışı Başlatıldı) aşamasından sonra Apigee Edge tarafından oluşturulduğu için arka uç sunucusu URL'sindeki path değerinin boş olduğunu gösterir. Bu durum, büyük olasılıkla target.url akış değişkeni (arka uç sunucusunun URL'sini temsil eder) istek akışındaki politikalardan biri aracılığıyla boş bir yolla güncellendiğinde meydana gelir.

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

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

    Yukarıda gösterilen örnek izlemede, akış değişkeni değişkeninin değerinin, SetTargetURL adlı bir JavaScript politikasında aşağıdaki şekilde güncellendiğini unutmayın: target.url

    target.url : https://mocktarget.apigee.net
  9. target.url öğesinin aşağıdaki bileşenlere sahip olduğunu unutmayın:
    • şema: https://mocktarget.apigee.net
    • path: boş
  10. Bu nedenle, Request path cannot be empty 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ğı kaydırarak Phase Details - Error Headers (Aşama Ayrıntıları - Hata Başlıkları) bölümüne gidin ve aşağıdaki gibi X-Apigee-fault-code ve X-Apigee-fault-source değerlerini belirleyin:

  13. X-Apigee-fault-code ve X-Apigee-fault-source değerlerini sırasıyla protocol.http.EmptyPath ve target olarak görürsünüz. Bu, hatanın arka uç sunucusu URL'sinin boş bir yola sahip olmasından kaynaklandığını gösterir.
    Yanıt Başlıkları Değer
    X-Apigee-fault-code protocol.http.EmptyPath
    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.EmptyPath 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.EmptyPath 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 yer almaktadır:

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

    X-Apigee-fault-code ve X-Apigee-fault-source değerlerinin sırasıyla protocol.http.EmptyPath ve target olduğunu unutmayın. Bu durum, hatanın arka uç sunucusu URL'sinde boş yol olmasından kaynaklandığını gösterir.

Neden: Arka uç sunucusu URL'sinde (target.url) boş yol var

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.EmptyPath ise ve Hata Kaynağı target değerine sahipse bu, arka uç sunucusu URL'sinin boş 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 arka uç sunucusu URL'sini güncellemeye çalışırsanız oluşur. Bu durumda, hedef istek akışındaki politikaların (Proxy/paylaşılan akış içinde) herhangi biri kullanılarak target.url dinamik olarak güncellenen URL'nin boş bir yolu olur.

  4. Aşağıdaki adımlardan birini kullanarak akış değişkeni target.url'nin gerçekten boş bir yola sahip olup olmadığını ve değerinin kaynağını belirleyin:

    Trace

    Trace aracını kullanma

    Bu hatayla ilgili bir iz yakaladıysanız İzleme Aracı'nı Kullanma bölümünde açıklanan adımları uygulayın ve:

    1. target.url adlı cihazda boş bir yol olup olmadığını doğrulayın.
    2. Evetse target.url değerini boş yol içerecek şekilde hangi politikanın değiştirdiğini veya güncellediğini öğrenin.

      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 boş 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://mocktarget.apigee.net
      • path: boş

    Günlükler

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

    1. Bu hatayla ilgili izleme kaydınız yoksa (aralıklı olarak yaşanan 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 içinde boş bir yol olup olmadığını doğrulayın ve
      2. target.url içeriğini boş bir yol içerecek şekilde hangi politikanın değiştirdiğini belirleyip belirleyemeyeceğ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 değiştiren veya güncelleyen belirli politikayı (ör. AssignMessage veya JavaScript) dikkatlice inceleyin target.url ve target.url'nın boş 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 boş bir yol içerecek şekilde değiştiren birkaç örnek politika verilmiştir.

    1. örnek

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

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

    Yukarıdaki örnekte, akış değişkeni target.url değerinin, başka bir değişken olan url içinde bulunan https://mocktarget.apigee.net değeriyle güncellendiğini unutmayın.

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

    • şema: https://mocktarget.apigee.net
    • path: boş

    Yol boş olduğundan Apigee Edge, 500 Internal Server Error ile birlikte protocol.http.EmptyPath hata kodunu döndürür.

    2. örnek

    2. örnek: JavaScript target.url değişkenini kullanarak politikayı güncelleme

    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 ile request.header.Path. değerinden 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>
    

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

    Bu durumda:

    • url = https://mocktarget.apigee.net + path
    • url = https://mocktarget.apigee.net + null
    • target.url = https://mocktarget.apigee.netnull

    target.url aşağıdaki bileşenlere sahiptir:

    • şema: https://mocktarget.apigee.netnull
    • path: boş

    3. örnek

    3. örnek: AssignMessage politikası, başka bir değişken aracılığıyla 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</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>

    target.url aşağıdaki bileşenlere sahiptir:

    • şema: https://mocktarget.apigee.net
    • path: boş

    Yukarıdaki örneklerin tümünde, arka uç sunucusu URL'sindeki yol (yani target.url) boş olduğundan Apigee Edge, protocol.http.EmptyPath hata koduyla 500 Internal Server Error değerini döndürür.

Çözünürlük

RFC 3986, bölüm 2: Söz Dizimi Bileşenleri spesifikasyonuna göre path bileşeni zorunludur ve path'nin bir parçası olarak başka karakter olmasa bile her zaman eğik çizgi (/) içermelidir. 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 boş olmayan bir yola sahip olduğundan 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 target.url değerini belirlemek için başka değişkenler kullanıyorsanız diğer değişkenlerin boş bir yolu 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 sonucunda boş bir yol olmadığından emin olun.
  2. Teşhis bölümünde ele alınan örneklerde bu sorunu aşağıdaki gibi düzeltebilirsiniz:

    1. örnek

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

    Bu sorunu düzeltmek için url değişkenine eğik çizgi (/) ekleyin.

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

    2. örnek

    2. örnek: JavaScript target.url değişkenini kullanarak politikayı güncelleme

    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 /iloveapis Path gibi geçerli bir yol ilettiğinizden emin olun.

    Örnek istek:

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

    3. örnek

    3. örnek: AssignMessage politikası, başka bir değişken aracılığıyla target.url değişkenini güncelliyor

    AssignMessage politikasının <Value> öğesine geçerli bir yol ekleyin. Örneğin, MockTarget API'nin yolu olarak /json 'yı kullanabilirsiniz. Yani, <Value> öğesini aşağıdaki gibi https://mocktarget.apigee.net/json olarak değiştirin:

    <AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL">
        <DisplayName>AM-SetTargetURL</DisplayName>
        <AssignVariable>
             <Name>target.url</Name>
             <Value>https://mocktarget.apigee.net/json</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>

Spesifikasyon

Apigee Edge, aşağıdaki spesifikasyonlara göre arka uç sunucu URL'sinin boş bir yola sahip olmamasını bekler:

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

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

Teşhis bilgilerini toplama

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'si adı
  • 500 Internal Server Error öğesini protocol.http.EmptyPath 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