400 Hatalı İstek - Yinelenen Başlık

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.DuplicateHeader hata koduyla birlikte 400 Bad Request HTTP durum kodunu alır.

Hata mesajı

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

HTTP/1.1 400 Bad Request

Ayrıca aşağıdakine benzer bir hata mesajı da görebilirsiniz:

{
   "fault":{
      "faultstring":"Duplicate Header \"Expires\"",
      "detail":{
         "errorcode":"protocol.http.DuplicateHeader"
      }
   }
}

Olası nedenler

Bu hata, Apigee Edge'de yinelenmesine izin verilmeyen belirli bir HTTP üst bilgisi, istemci tarafından Apigee Edge'e gönderilen HTTP isteğinin bir parçası olarak aynı veya farklı değerlerle birden fazla kez görünüyorsa ortaya çıkar.

RFC 7230, bölüm 3.2.2: Alan Sırası'na göre, bir gönderen, bir iletide aynı alan adına sahip birden fazla üstbilgi alanı OLUŞTURMAMALIDIR.Bu alanlardan biri, söz konusu üstbilgi alanının tüm alan değerinin virgülle ayrılmış bir liste olarak tanımlanmadığı ([ör. #(values)] veya başlık alanı iyi bilinen bir istisnadır. Apigee Edge, istemci tarafından gönderilen HTTP isteğinde birden fazla kez yinelenen olmasına izin verilmeyen belirli bir başlık bulursa 400 Bad Request ve protocol.http.DuplicateHeader hata koduyla yanıt verir.

Bu hatanın olası nedenleri aşağıda açıklanmıştır:

Neden Açıklama Şunun için geçerli sorun giderme talimatları:
İstekte yinelenen başlık İstemci uygulamasından Apigee'ye yapılan HTTP isteği, yinelenen başlıklar içeriyor. 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

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. Proxy filtresinin Tümü olarak ayarlandığından emin olun.
  6. Hata Kodu'nu Zamana göre çizin.
  7. Aşağıda gösterildiği gibi protocol.http.DuplicateHeader hata koduna sahip bir hücre seçin:

  8. protocol.http.DuplicateHeader hata kodu ile ilgili bilgi aşağıda gösterildiği gibi gösterilmektedir:

  9. Günlükleri görüntüle'yi tıklayın ve başarısız isteğin satırını genişletin.
  10. Günlükler penceresinde aşağıdaki ayrıntıları dikkate alın:
    1. Durum Kodu: 400
    2. Hata Kaynağı: apigee
    3. Hata Kodu: protocol.http.DuplicateHeader.
  11. Hata Kaynağı apigee veya MP değerine ve Hata Kodu protocol.http.DuplicateHeader değerine sahipse bu durum, istemciden gelen HTTP isteğinin yinelenen üstbilgiler içerdiğini gösterir.

İzleme aracı

NGINX

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

  1. Private Cloud kullanıcısıysanız HTTP 400 hatalarıyla 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

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

  3. Belirli bir süre boyunca 400 hatası olup olmadığını (sorun geçmişte gerçekleştiyse) veya 400 nedeniyle başarısız olan istekler olup olmadığını görmek için arama yapın.
  4. protocol.http.DuplicateHeader değeriyle eşleşen X-Apigee-fault-code ile herhangi bir 400 hatası bulursanız X-Apigee-fault-source değerini belirleyin.

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

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

    Yanıt Başlıkları Değer
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source MP

Neden: İstekte yinelenen başlık

Teşhis

  1. API Monitoring veya NGINX erişim günlükleri kullanılarak gözlemlenen hata için Yaygın teşhis adımları bölümünde açıklandığı şekilde Hata Kodu ve Hata Kaynağı'nı belirleyin.
  2. Hata Kaynağı apigee veya MP değerine sahipse bu, istemci uygulaması tarafından Apigee'ye gönderilen isteğin yinelenen başlıklar içerdiğini gösterir.
  3. Aşağıdaki yöntemlerden birini kullanarak isteğin bir parçası olarak birden fazla kez gönderilen gerçek başlığı belirleyebilirsiniz:

    Hata mesajı

    Hata mesajını kullanma

    1. Apigee Edge'den alınan hata mesajının tamamına erişiminiz varsa faultstring dokümanına bakın. faultstring, birden fazla kez gönderilen üst bilgi adını içerir.

      Örnek hata mesajı:

      "faultstring":"Duplicate Header \"Expires\""
      
    2. Yukarıdaki hata mesajında, Expires üst bilgisinin faultstring öğesinde olduğu gibi birden fazla kez gönderildiğini görebilirsiniz.

    Gerçek istek

    Asıl isteği kullanma

    1. İstemci uygulaması tarafından yapılan gerçek isteğe erişiminiz varsa aşağıdaki adımları uygulayın:

      1. İstekte iletilen üstbilgilerin listesini doğrulayın.
      2. Belirli bir başlığın , istekte aynı veya farklı değerlerle birden fazla kez geçtiğini fark ederseniz bu hatanın nedeni budur.

      Örnek İstek:

      curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT" -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
      

      Yukarıdaki örnek istekte, Expires başlığı bir kereden fazla gönderilmiştir. Bu nedenle, bu istek 400 Bad Request hatası ve şu hata koduyla başarısız olur: protocol.http.DuplicateHeader.

    2. Alternatif olarak, istemci günlüklerine erişiminiz varsa Apigee Edge'e yapılan gerçek istek hakkında bilginiz olup olmadığını görebilir ve birden fazla kez gönderilen başlığı belirleyebilirsiniz.

Çözünürlük

Yinelemeyi düzelt

1. Seçenek [Önerilen Seçenek] İstemci uygulamasının yinelenen başlıklar eklememesi için düzeltme

  1. İlgili istemcinin yinelenen üstbilgi gönderme nedenini analiz edin. Örneğin, yukarıdaki örnekte Expires. API proxy'lerinin, yinelenen üst bilgiyi kabul edebileceğini doğrulayın. RFC7230 HTTP spesifikasyonuna göre bu durum genellikle istenmeyen bir durumdur.
  2. Bu istenen bir durum değilse istemci uygulamanızı yinelenen başlıklar göndermeyecek şekilde değiştirin.

    Yukarıda açıklanan örnekte, Expires başlığının aynı değerle iki kez gönderildiği fark edilmiştir. Bu durum istenmeyen bir durumdur. Aşağıda gösterildiği gibi Expires başlığını yalnızca bir kez ileterek sorunu düzeltebilirsiniz:

    curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
    
  3. Bunu tercih ediyorsanız ve yinelenen başlıklara izin vermek istiyorsanız 2. Seçenek'e (CwC mülkü kullanarak) gidin.

CwC

2. Seçenek: CwC mülkünü kullanma

Apigee ,istemci uygulamalarının ve hedef sunucuların Apigee Edge'deki API proxy'lerine yinelenen üstbilgiler göndermesini sağlayan bir CwC özelliği HTTPHeader.<HeaderName> sunar.

CwC mülkü Değerler
HTTPHeader.<HeaderName> allowDuplicates,multivalued

Örneğin, Mesaj İşleyicilerinde aşağıdaki özellik, Expires başlığı için yinelenen ve birden çok değere izin verecek şekilde ayarlanabilir.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. Private Cloud kullanıcısıysanız isteği İleti İşleyicileri yinelenen üstbilgiler kullanacak şekilde yapılandırma "Nasıl Yapılır?" kılavuzunu kullanarak mülkü Apigee Edge'in 400 Bad Request hatası oluşturmasını önleyecek şekilde yapılandırabilirsiniz.
  2. Herkese Açık Bulut kullanıcısıysanız bu özelliği kuruluşunuz için yapılandırmak üzere Apigee Edge Destek Ekibi ile iletişime geçin.

Spesifikasyon

Apigee, istemci uygulamasının aşağıdaki RFC özelliklerine göre isteğin bir parçası olarak yinelenen üstbilgiler göndermemesini bekler:

Spesifikasyon
RFC 7230, bölüm 3.2.2: Alan Sırası
RFC 7230, bölüm 3.2 Üstbilgi Alanları

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

Aşağıdaki teşhis bilgilerini toplayın ve ardından 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ı
  • 400 hatasını 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
  • 400 hatasını yeniden oluşturmak için kullandığınız curl komutunu tamamlayın
  • 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