HTTP Önbelleklemede 304 Not Modified Yanıtını Anlamak

Web uygulamaları geliştirirken, verimli kaynak yönetimi performans için kritik öneme sahiptir, özellikle dosya erişimi ve tarayıcı önbelleklemesi söz konusu olduğunda. Bu süreci optimize etmenin bir yolu, 304 Not Modified HTTP yanıtını doğru bir şekilde kullanmaktır. Bu yanıt, tarayıcıya talep ettiği kaynağın en son alındığı zamandan beri değişmediğini bildirir, böylece tarayıcı, kaynağı tekrar indirmek yerine önbellekteki sürümünü kullanmaya devam edebilir. Peki, bu yanıtı ne zaman göndereceğinizi nasıl bilirsiniz? Adım adım inceleyelim.

Kontrol Edilmesi Gereken Temel HTTP Başlıkları

304 Not Modified yanıtını gönderip göndermeyeceğinizi belirlemek için, istemcinin tarayıcısı tarafından gönderilen belirli HTTP başlıklarını kontrol etmeniz gerekir. Üzerinde durulması gereken iki ana başlık şunlardır:

  1. Etag: Bu başlık, belirli bir versiyondaki bir kaynak için benzersiz bir tanımlayıcı olarak işlev görür. Tarayıcı, önbellekteki Etag’i sunucunun Etag’i ile karşılaştırarak eşleşip eşleşmediğine bakar.
  2. If-None-Match: Bu başlık, tarayıcı tarafından gönderilir ve önceki önbelleklenen Etag değerini içerir. Eğer kaynak değişmemişse, sunucu 304 ile yanıt verebilir.

Dikkat Edilmesi Gerekenler

  • Tarayıcıdan gelen Etag varsa: Tarayıcı, istekte Etag veya If-None-Match başlıklarından birini içeriyorsa, bu önceden önbelleğe alınmış bir sürümü olduğunu gösterir.
  • Alıntı Dikkatleri: Tarayıcılar bazen Etag değerini alıntı içinde verir. Karşılaştırmadan önce bu alıntıları kaldırdığınızdan emin olun.

İlk Yanıt İçin Gerekli Başlıklar

Kaynağı ilk kez gönderirken (genellikle 200 OK yanıtıyla), tarayıcıya kaynağın durumu hakkında bilgi verecek ilgili başlıkları dahil etmek önemlidir:

  • Last-Modified: Kaynağın en son ne zaman değiştirildiğini belirtir. Bu, Etag ile birlikte önbellek geçerliliği için alternatif bir kontrol olabilir.
  • Etag (daha önce bahsedildiği gibi): Bu, kaynak için oluşturulmalı ve gelecekteki önbellek geçerliliği için yanıt başlıklarına dahil edilmelidir.

Mantığı Uygulama

İşte 304 Not Modified yanıtını göndermek için mantığı uygulamanın basitleştirilmiş bir pseudocode örneği:

server_etag = gen_etag_for_this_file(myfile)
etag_from_browser = get_header("Etag")

if etag_from_browser does not exist:
    etag_from_browser = get_header("If-None-Match")
if the browser has quoted the etag:
    strip the quotes (e.g. "foo" --> foo)

set server_etag into http header

if etag_from_browser matches server_etag
    send 304 return code to browser

Örnek Sunucu Mantığı Kodu

İşte bunu sunucu mantığınızda nasıl uygulayabileceğinize dair bir örnek:

/* istemci ya Etag ya da If-None-Match ayarlamalıdır */
mketag(etag, &sb);

etagin = apr_table_get(r->headers_in, "Etag");
if (etagin == NULL)
    etagin = apr_table_get(r->headers_in, "If-None-Match");
if (etag != NULL && etag[0] == '"') {
    /* Varsa alıntıları kaldır */
    int sl; 
    sl = strlen(etag);
    memmove(etag, etag+1, sl+1);
    etag[sl-2] = 0;
}   

apr_table_add(r->headers_out, "ETag", etag);

if (etagin != NULL && strcmp(etagin, etag) == 0) {
    /* Eğer etag eşleşiyorsa, 304 durumunu döndür */
    rc = HTTP_NOT_MODIFIED;
}

Son Düşünceler

304 Not Modified yanıtını nasıl ve ne zaman göndereceğinizi bilerek, sunucu yükünü etkili bir şekilde azaltabilir ve kullanıcı deneyimini iyileştirebilirsiniz. İstemcinin daha sonra doğru önbellek geçerliliği talepleri yapabilmesi için ilk yanıtta Etag ve Last-Modified başlıklarının dahil edilmesinin önemini unutmayın. Etag oluşturma hakkında sorularınız veya daha fazla uygulama yardımı ihtiyaçlarınız varsa, daha ayrıntılı örnekler için çekinmeden ulaşın. İyi kodlamalar!