Önbelleklemenin birden fazla yolu vardır.
Koşullu GET
Bu görüntüleri dosya sisteminde saklıyorsanız ve doğrudan web sunucusu üzerinden sunuyorsanız, büyük olasılıkla koşullu get kullanıyorsunuzdur . Web sunucusu, bir ETAG üstbilgisi ayarlamak için dosya sistemi meta verilerini otomatik olarak kullanır ve tarayıcı isteğinde yer alıyorsa If-Modified-Since
veya If-Matches
üstbilgiler içeriyorsa otomatik olarak "304 Değiştirilmedi" ile yanıt verir . (Tüm tarayıcılar çalışacaktır.)
Bu durumda görüntünün tamamı geri sunulmaz, bu nedenle bant genişliği tasarrufunuz olur. Bununla birlikte, bir GET isteği düzenlenmeye devam edecektir, bu nedenle yine de bir isteğin ek yükü ve gecikmesine sahip olacaksınız.
Web sunucunuzun Cache-Control
üstbilgilerinizi public,max-age=N
resimleriniz için bir değer ayarlamasını sağlayarak önbellek tazeliği pahasına istek sayısını biraz azaltabilirsiniz . Bu, önbelleklerin max-age
güncellenip güncellenmediğini kontrol etmeden önce kaynağı en fazla saniye tutabileceğini söylüyor .
Ancak HTTP, uygulamanızın semantiğine uymayabilecek bir önbellek girdisini geçersiz kılmanın yalnızca bir yolunu tanımlar: profil fotoğrafını güncelleyen bir URL'ye POST veya PUT yazarsanız, bir Location: [url of photo]
üstbilgiyle yanıtlayın ve bu url için önbellek girdisi geçersiz kılınacaktır.
(Bu, bir web sayfasını yorumlarla önbelleğe almanızı ve ardından kullanıcı yeni bir yorum gönderdikten sonra sayfayı tarayıcı tarafından zorla yeniden yüklemenizi sağlayan mekanizmadır. Tarayıcı bir POST /comment
ile 303 See Other
ve a'ya yanıt verecektir Location: /page/with/comment
. Uzun süredir devam eden bir hata nedeniyle Firefox'ta çalışmak .)
Çok fazla trafiğiniz olmadığı sürece, bu önbelleğe alma yaklaşımı iyidir.
URL'leri değiştirme
URL, bir kaynağın temsilidir, bu nedenle önbelleğe almayı yönetmenin başka bir yolu da kaynağın önbellek parametrelerini değiştirmek değil, "sonsuza kadar önbellek" direktifiyle yepyeni bir kaynak oluşturmaktır. Bu, "büyük oğlanlar" ın tercih ettiği yaklaşımdır, çünkü fazladan istek üretmelerine izin vermez , bu da onları çok fazla bant genişliği tasarrufu sağlar. Dezavantajı çok daha fazla defter tutma gerektirir.
Bunun için iki genel teknik vardır.
Sorgu dizeleri
Web sunucuları, dosya sisteminden bir dosya sunarken sorgu dizelerini yok sayar. Ancak önbellekler şunları yapmaz: /1.jpg?t=12345
ve /1.jpg?t=67890
sunucu aynı olduklarını düşünmesine rağmen tamamen farklı, ilgisiz iki kaynaktır.
Yapabileceğiniz kolay bir şey, html'nizdeki bir kaynağa başvuru yaptığınızda ve uzun bir Expires
başlık ayarladığınızda dosya sistemi zaman damgasını sorgu dizesi olarak eklemektir. Tarayıcı daha sonra bu kaynağı sonsuza kadar önbelleğe alır ve sorgu dizesi değişmediği sürece herhangi bir GET yapmaz.
Bir dezavantajı, bir önbelleği zorla geçersiz kılmak istiyorsanız, yeni URL'nin web sunucusuna bir öğe için talimat vermenin zor veya imkansız olmasıdır. Örneğin, bir tarayıcının /1.jpg?v=1
referansı olan önbelleğe alınmış bir HTML sayfası varsa , ancak girişini temizlediyse /1.jpg?v=1
(belki dosya veya bellek alanından yoksun), yeni bir istekte bulunacaktır /1.jpg?v=1
. Bu arada görüntü olarak değiştiyse /1.jpg?v=2
, uygun yanıt:
- Dosyanın eski sürümünü sunun. Tüm kaynakların belirli bir zamanda olduğu gibi birbirleriyle tutarlı olmasını istiyorsanız bunu yaparsınız. Örneğin, eski bir html dosyasına sahip yeni bir css dosyası düzgün çalışmayabileceğinden, CSS dosyaları ile yapmanız gereken budur!
- Düğmesini kullanarak dosyanın yeni sürümüne yönlendirin
301 Moved Permanently
. Tüm kaynakların mümkün olduğunca yeni olmasını istiyorsanız bunu yapardınız.
Bunların her ikisini de tek başına bir web sunucusu ile yapmak zordur, bu da hem daha karmaşık hem de daha kaynak yoğun olabilen görüntü istekleri için bile bir web uygulaması başlatmanız gerektiği anlamına gelir. Web sunucuları dosya sunma konusunda çok hızlıdır , bu nedenle bir web uygulamasının ek yükü bant genişliği ve gecikme kazanımlarınızı yutabilir.
Dosya adları
Bir sorgu dizesi eklemek yerine dosya adını değiştirirsiniz. Bu, dosya sisteminde birden çok dosya sürümünü tutmanın kolay olduğu anlamına gelir, ancak kaynaklarınızı ve adlarını takip etmek için muhtemelen dosya meta verilerini depolamanız ve başka bir veritabanı defteri tutmanız gerekir.