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

Olası nedenler

Bu hata, arka uç sunucusunun target.url akış değişkeniyle temsil edilen istek URL'si boş bir yol 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 ve yolun parçası olarak başka karakter olmasa bile her zaman bir öne eğik çizgi (/) OLMALIDIR.

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

Örneğin: target.url, https://www.mocktarget.apigee.net değerine sahipse bu hata path bileşeni boş veya eksik olduğundan ortaya çıkar.

Neden Açıklama Şunun için geçerli sorun giderme talimatları:
Arka uç sunucusu URL'sinin (target.url) yolu boş target.url akış değişkeni tarafından temsil edilen arka uç sunucusu URL'sinin boş bir yolu var. 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. Apigee Edge kullanıcı arayüzünde uygun bir role sahip bir kullanıcı olarak 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.EmptyPath hata koduna sahip bir hücre seçin:

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

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

  9. Günlükler penceresinde aşağıdaki ayrıntıları dikkate alın:
    • Durum Kodu: 500
    • Hata Kaynağı: target
    • Hata Kodu: protocol.http.EmptyPath
  10. Hata Kaynağı target ve Hata Kodu protocol.http.EmptyPath ise bu durum, arka uç sunucu URL'sinin boş 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şladı aşamasından sonraki bir akışta bulabilirsiniz:

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

    hata: İstek yolu boş olamaz

    Hata, Hedef İstek Akışı Başlatıldı aşamasından sonra Apigee Edge tarafından bildirildiği için arka uç sunucu URL'sindeki path değerinin boş olduğunu belirtir. 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 olur.

  7. Hata noktası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. Akış değişkeninin target.url 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 SetTargetURL adlı bir JavaScript politikasında şu şekilde güncellendiğini unutmayın:

    target.url : https://mocktarget.apigee.net
    
  9. target.url aşağıdaki bileşenlere sahiptir:
    • şema: https://mocktarget.apigee.net
    • path: boş
  10. Bu nedenle Request path cannot be empty 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.EmptyPath ve target olarak göreceksiniz. Bu, arka uç sunucusu URL'sinde boş bir yol bulunması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. 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.EmptyPath hata koduna sahip 500 hatası (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-fault-code ve X-Apigee-fault-source için aşağıdaki değerlere sahiptir:

    Ü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 oldığına dikkat edin. Bu hata, arka uç sunucusu URL'sinde boş bir yol olmasından kaynaklanır.

Neden: Arka uç sunucusu URL'sinin (target.url) yolu boş

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.EmptyPath ise ve Hata Kaynağı target değerine sahipse bu durum, arka uç sunucu 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 temsil edilir. Bu hata genellikle arka uç sunucu URL'sini, yani target.url dinamik olarak Hedef istek akışındaki politikalardan herhangi birini (Proxy/paylaşılan akışı içinde) kullanarak ve boş yola sahip şekilde güncellemeye çalışırsanız ortaya çıkar.

  4. Aşağıdaki adımlardan birini kullanarak target.url akış değişkeninin gerçekten boş bir yola sahip 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 ve:

    1. target.url yolunun boş olup olmadığını doğrulayın.
    2. Cevabınız evet ise hangi politikanın target.url değerini boş yol içerecek şekilde değiştirdiğini veya güncellediğini öğ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 boş 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://mocktarget.apigee.net
      • path: boş

    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 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 boş olup olmadığını doğrulayın ve
      2. Değiştirilen target.url politikasını, boş bir yol içerecek şekilde 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 dikkatle değiştiren veya güncelleyen politikayı (örneğin, AtaMessage veya JavaScript) inceleyin ve target.url politikasının boş bir yol olarak güncellenmesinin nedenini belirleyin.

    target.url akış değişkenini, bu hataya yol açan boş bir yol içerecek şekilde yanlış bir şekilde güncelleyen birkaç örnek politika aşağıda verilmiştir.

    1. Örnek

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

    var url = "https://mocktarget.apigee.net"
    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 değeriyle güncellendiğine dikkat edin.

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

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

    Yol boş olduğundan Apigee Edge, protocol.http.EmptyPath hata koduyla 500 Internal Server Error değerini döndürür.

    Örnek 2

    2. Örnek: JavaScript Politikası target.url değişkenini 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şkendeki https://mocktarget.apigee.net değeri url ile değeri request.header.Path. kaynağından alınan başka bir değişkenin değeri (path) birleştirerek 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>
    

    Bu örnekte başlık yolu, isteğin bir parçası olarak gönderilmez. Dolayısıyla, JavaScript politikasındaki değişken yolunun değeri null şeklindedir.

    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ş

    Örnek 3

    3. Örnek: AttributionMessage Policy, target.url değişkenini başka bir değişkenle 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ç sunucu URL'sindeki yol (target.url) boştur. Bu nedenle Apigee Edge, protocol.http.EmptyPath hata koduyla 500 Internal Server Error döndürür.

Çözünürlük

RFC 3986, bölüm 2: Söz Dizimi Bileşenleri spesifikasyonu uyarınca path bileşeni zorunludur ve path bileşeninin parçası olarak başka karakter olmasa bile her zaman bir öne eğik çizgi (/) OLMALIDIR. 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 boş olmayan bir yola sahip olduğundan emin olun.
    1. Bazı durumlarda, yolda kaynak adınız olmayabilir. Ardından yolun en azından bir 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 yolu boş olmadığı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 sonucunda veya sonucunda boş yol olmadığından emin olun.
  2. Teşhis bölümünde ele alınan ö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 düzeltmek için aşağıda gösterildiği gibi url değişkenine bir düz eğik çizgi (/) ekleyin:

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

    Örnek 2

    2. Örnek: JavaScript Politikası target.url değişkenini 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 (ör. Path istek başlığının parçası olarak /iloveapis) ilettiğinizden emin olun:

    Örnek istek:

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

    Örnek 3

    3. Örnek: AttributionMessage politikası, target.url değişkenini başka bir değişkenle güncelliyor

    AtaMessage politikasının <Value> öğesine geçerli bir yol ekleyin. Örneğin, MockTarget API için yol olarak /json kullanabilirsiniz. Yani <Value> öğesini aşağıda gösterildiği 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 spesifikasyonlar uyarınca arka uç sunucusu URL'sinin boş bir yoluna 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 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 adı
  • 500 Internal Server Error dosyasını protocol.http.EmptyPath 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