Politikayı sunucuya değil kaynağa eşleyin
Başlıkları değiştirmeden önce temsilci URL'lerin envanterini çıkarın: anasayfa, içerik sayfası, uygulama kabuğu, CSS, JavaScript, resimler, fontlar, API'ler, giriş, hesap, ödeme ve indirmeler. Her biri için yanıtın herkese açık mı yoksa kişiselleştirilmiş mi olduğunu, URL değiştiğinde baytların değişip değişmediğini ve düzeltmenin ziyaretçilere ne kadar hızlı ulaşması gerektiğini kaydedin.
Bu envanterden bir politika matrisi oluşturun. İçerik-adresli (content-addressed) herkese açık bir varlık ile sabit adreste bulunan HTML için farklı kurallar gerekir. Cache-Control olmayan yanıtlar yine sezgisel olarak önbelleğe alınabilir, bu yüzden açık kurallar test etmeyi kolaylaştırır.
Saklanan bir yanıtın yeniden kullanılabileceği süre; max-age bunu saniye cinsinden verir.
Cache-Control terimlerini doğru kullanın
Cache-Control, tarayıcılara ve paylaşılan önbelleklere bir yanıtın nasıl saklanacağı ve yeniden kullanılacağı konusunda talimat verir. max-age=N taze olduğu sürece yeniden kullanıma izin verir. s-maxage=N paylaşılan önbellekteki tazeliği belirler ve orada max-age'i geçersiz kılar; tarayıcılar s-maxage'i görmezden gelir. public herhangi bir önbelleğe izin verir; private tarayıcı önbelleklemesine izin verir ama paylaşılan önbellekte saklanmasını engeller.
no-cache depolamaya izin verir fakat yeniden kullanım öncesi origin doğrulaması gerektirir. no-store önbelleklerin yanıtı saklamamasını emreder, ancak bu eksiksiz bir gizlilik kontrolü değildir. must-revalidate, süresi dolmuş içeriğin servis edilmesinin kabul edilemez olduğu durumlarda kullanın; böylece kullanılabilir origin yoksa eski bir yedek yerine 504 dönebilir.
no-store saklamayı kaldırır; yalnızca gerçekten saklanmaması gereken yanıtlar için ayırın.
Değiştirilemez varlıkları uzun ömre vermeden önce sürümlendirin
Sürümlenmiş bir varlık URL'si içerik parmak izi veya sürüm içerir; ör. app.4f2c.js. Varlık baytları değiştiğinde farklı bir URL yayınlayın ve HTML referansını güncelleyin. Önbellek yeni bir kaynak görür, bu yüzden ziyaretçiler her tarayıcıya ulaşan bir invalidasyon olmadan yeni varlığı alır.
Tazelik ömrü boyunca değişmeyecek bir temsil için Cache-Control: max-age=31536000, immutable pratik bir desendir. immutable destekleyen istemcilere taze olduğu sürece koşullu yeniden doğrulama yapmamalarını söyler. Aynı adresteki değişken bir dosyaya yıl-aşırı max-age veya immutable uygulamayın. Önbellekteki HTML hâlâ bunlara referans verebileceğinden önceki fingerprint'li varlıkları saklayın.
HTML hangi varlık URL'lerinin yükleneceğini seçer; bu yüzden sürüm sıralaması referans verilen nesli korumalıdır.
HTML'i uzun önbellekleme yerine doğrulama ile güncel tutun
HTML genellikle sabit, insan tarafından okunan bir URL'ye sahiptir ve içerik, varlık referansları, özellik bayrakları veya güvenlik duyuruları ile değişir. Muhafazakâr bir herkese açık HTML deseni, platformunuz bunları doğru üretebiliyorsa Cache-Control: no-cache ile ETag ve Last-Modified kullanmaktır. Tarayıcı gövdeyi depolar ama yeniden kullanım öncesi koşullu istek yapar; değişmemişse 304 Not Modified gövdesiz dönebilir.
ETag bir kaynak sürümünü tanımlar. Bir yanıt artık olduğunda tarayıcı bunu If-None-Match içinde gönderebilir; eşleşirse sunucu 304 döner, aksi halde yeni temsili gönderir. RFC yönergeleri mümkünse 200 yanıtında hem ETag hem Last-Modified kullanılmasını tercih eder. no-cache, Geri veya İleri (Back/Forward) gezinmede tarayıcının mutlaka doğrulama yapacağını garanti etmez; tarayıcı oturum geçmişi anlık görüntüsünü geri yükleyebilir.
ETag, temsil değiştiğinde mutlaka değişmelidir; bunu originler ve dağıtımlar arasında test edin.
Herkese açık teslimatı kişiselleştirilmiş ve hassas yanıtlardan ayırın
CDN gibi paylaşılan bir önbellek bir yanıtı birden çok kullanıcı için yeniden kullanabilir. Hesap-özel HTML veya API verilerinin kullanıcılar arasında yeniden kullanılmasına izin vermeyin. Tarayıcıda yaşayabilecek kişiselleştirilmiş içerikler için private, no-cache mantıklı bir başlangıçtır: paylaşılan depolamayı engeller ve doğrulama gerektirir. Sadece Set-Cookie başlığı tek başına önbelleklemenin durmasını sağlamaz.
Saklanmaması gereken yanıtlar için no-store kullanın ve uygulama kodu, CDN kuralları, servis çalışanları (service workers), tarayıcı depolaması, loglar ve hata sayfalarını gözden geçirin. Başlıklar tek başına gizlilik, uyumluluk veya ödeme güvenliği programı değildir. Hassas akışları ve uygulanabilir gereksinimleri nitelikli güvenlik, gizlilik ve ödeme inceleyicilerine doğrulatın.
Giriş, çıkış, hesap değiştirme ve izin değişikliklerini sıcak (warm) tarayıcı ve CDN önbellekleri ile test edin.
Önbellek değişikliklerini geri alınabilir bir sürüm olarak devreye sokun
Önce değişiklik öncesi başlıklar ve gövde davranışı için temel durumu yakalayın. Hazırlık ortamında önce sürümlenmiş varlıkları dağıtın, sonra bunlara referans veren HTML'i yayınlayın ve önceden önbelleğe alınmış eski HTML'i yeni origin ile test edin. Hem doğrudan origin hem CDN yollarını kontrol edin. DevTools Network başlıkları istenen politikayı ve tekrar davranışını göstermelidir.
Varlık URL'leri, başlık kuralları ve konfigürasyon sürümünü içeren bir sürüm manifestosu tutun. Bir sürüm uyumsuz istemci dosyalarını birleştiriyorsa, uyumlu HTML ve uygulama davranışını geri döndürün; ancak yayınlanmış fingerprint'li bir dosyayı değiştirmeyin. HTML'i bilinen-iyi nesle yönlendirin ve önbellekteki HTML bunları isteyebildiği sürece her iki nesli de koruyun. Paylaşılan önbelleği temizlemek (purge) tarayıcıların taze bir yanıtı atmasını zorlayamaz.
Başlık test hatalarını, varlık 404'lerini ve sürüm uyumsuzluklarını bir sonraki sürüm kontrol listesine düzeltilecek maddeler olarak ekleyin.
