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:
- 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.
- 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
veyaIf-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!