Bu başlığı kim dinliyor
Tek bir cevap birkaç cache'ten geçer: ziyaretçinin tarayıcısı (özel — tek kişiye sunar), CDN edge'i (paylaşımlı — herkese sunar) ve bazen arada bir proxy. Cache-Control, origin'in hepsiyle aynı anda konuşma şeklidir; ayrı ayrı hitap eden direktiflerin var olma sebebi de budur.
Bu ayrım geri kalan her şeyi belirler. Girişli bir kontrol paneli o kullanıcının tarayıcısında cache'lenebilir ama başka bir kullanıcının alabileceği edge'de asla cache'lenmemelidir. Herkese açık bir pazarlama sayfası tam tersidir: edge'de sıkı, tarayıcıda kısa cache'leyin. Önce "özel mi paylaşımlı mı" diye karar vermek diğer bütün seçimleri belirgin hâle getirir.
Gerçekten önemli olan direktifler
max-age=N — N saniye boyunca tekrar sormadan kullanılabilir. Ana kadran.
s-maxage=N — aynısı, ama yalnızca paylaşımlı cache'ler (CDN) için. Varsa edge ona uyar ve max-age'i yok sayar; böylece bir şeyi edge'de bir saat, tarayıcılarda bir dakika tutabilirsiniz.
public / private — public her cache tarafından saklanabilir; private saklamayı yalnızca o tarayıcıya kısıtlar. Kullanıcıya özel her şey private olmalıdır.
no-cache — sakla ama her kullanımdan önce origin ile doğrula. Değişmediğinde ucuzdur: sunucu gövdesiz 304 Not Modified cevaplayabilir.
no-store — hiçbir cache'e, ne bellekte ne diskte yazma. Bunu gerçekten hassas cevaplara saklayın; "lütfen taze olsun" değil, "hiç kopya tutma" demektir.
immutable — bu gövde bu URL'de asla değişmeyecek, yenilemede bile doğrulama yapma. Yalnızca sürümlü dosya adları için doğrudur.
stale-while-revalidate=N — süre dolduktan sonra, arka planda tazesi çekilirken bayat kopyayı N saniyeye kadar sunmaya devam et. Ziyaretçi yeniden çekmeyi hiç beklemez.
Çoğu siteyi kapsayan üç reçete
Sürümlü statik varlıklar — dosya adı içerik değiştikçe değişir, yani URL sonsuza kadar cache'lenebilir. Bu, mevcut en büyük ve en güvenli cache kazancıdır.
HTML sayfalar — URL aynı kalırken içerik değişir, yani kısa ömür gerekir. Kısa bir max-age artı stale-while-revalidate, dünkü sayfayı sunmadan hız verir.
Özel ya da kişiselleştirilmiş cevaplar — kontrol panelleri, sepetler, giriş arkasındaki her şey. Paylaşımlı cache'lerin dışında tutun; sizin için güvenliyse tarayıcı kısa süre tutabilir.
Kopyala-yapıştır başlangıç noktaları — sayıları sürüm sıklığınıza göre ayarlayın
# surumlu varliklar: /js/app.a1b2c3.js
Cache-Control: public, max-age=31536000, immutable
# HTML sayfalar (tarayicida kisa, edge'de uzun, yenilemede bekletmeden)
Cache-Control: public, max-age=60, s-maxage=600, stale-while-revalidate=86400
# kullaniciya ozel sayfalar: edge'e asla
Cache-Control: private, no-store
# sik degisen ama biraz gecikebilen bir API cevabi
Cache-Control: public, max-age=0, s-maxage=30, stale-while-revalidate=60
no-cache vs no-store: kaçınmaya değer hata
Bunlar eşanlamlı gibi okunur ama hiç benzemezler. no-cache saklamaya izin verir, yeniden kullanmadan önce doğrulama ister — kopya kalır ve hâlâ güncelse sunucu gövdesiz 304 döner, ki bu çok ucuzdur. no-store cevabı herhangi bir yerde tutmayı yasaklar.
no-cache demek isterken no-store'a uzanmak, hiçbir fayda karşılığında bütün optimizasyonu çöpe atar: hiçbir şey değişmese bile her istek tam indirme olur. no-store'u yalnızca saklanmış bir kopyanın kendisi sorun olduğunda kullanın — banka ekstreleri, parola sıfırlama sayfaları, paylaşılan bir makinenin cache'inde durmaması gereken her şey. "Hep en yenisini göster" için doğru ve çok daha ucuz cevap no-cache'tir.
Bu CDN'inizle nasıl etkileşiyor
Origin'inizin gönderdiği başlıklar, edge'in bir kopyayı ne kadar tutacağına karar verirken uyduğu şeydir — bu da Cache-Control'ü bir tarayıcı ayrıntısı değil, bütün dağıtım zincirinizin kontrol yüzeyi yapar. s-maxage gönderin, edge ona uyar; no-store gönderin, edge hiç cache'lemeyi reddeder — yani her istek origin'inize gider ve o cevap için CDN'i fiilen kapatmış olursunuz.
cdn.com.tr'de, uygulamanın başlıklarını değiştiremediğiniz durumlarda cache davranışını panelden dağıtım kuralı bazında da ayarlayabilirsiniz — dokunmak istemediğiniz eski uygulamalar için kullanışlıdır. Cache'lenmiş bir URL'in döndürdüğünü değiştirdiğinizde, edge'in süresi dolana kadar hâlâ önceki kopyayı tuttuğunu unutmayın: purge tam da bunun içindir.
Gerçekte ne gönderdiğinizi kontrol edin
Başlıklar hakkındaki varsayımlar sık sık yanlıştır — bir framework, eklenti ya da web sunucusu varsayılanı çoğu zaman ayarladığınızı sandığınız şeyi ezer. Her URL tipi için tek komutla doğrulayın; sürümlü bir varlığa ve bir HTML sayfaya ayrı ayrı bakın, çünkü tamamen farklı görünmeleri gerekir. Ayrıca herkese açık cache'lemek istediğiniz bir cevaptaki Set-Cookie'ye dikkat edin: birçok cache bunları saklamayı reddeder ve bir sayfanın gizemli biçimde hiç cache'lenmemesinin yaygın sebebidir.
Gerçek cevap başlıklarını okuyun
# edge ve origin gercekte ne diyor
curl -sI https://example.com/ | grep -i "cache-control\|age\|set-cookie"
# surumlu bir varlikla karsilastir (uzun max-age olmali)
curl -sI https://example.com/js/app.a1b2c3.js | grep -i cache-control
Sık sorulan sorular
HTML sayfalar için iyi bir max-age nedir?
Kısa — saniyeler ya da birkaç dakika — çünkü URL aynı kalırken içerik değişir. Bunu edge'de daha uzun bir s-maxage ve stale-while-revalidate ile eşleyin; ziyaretçi anında cevap alırken tazeleme arka planda olsun.
Cache-Control yanında Expires hâlâ gerekli mi?
Hayır. Cache-Control Expires'ın yerini alır ve ikisi birlikte göründüğünde kazanır. Expires yalnızca çok eski istemciler için önemlidir; göndermek zararsızdır ama bir şey katmaz.
Uzun max-age verdiğim hâlde sayfam neden cache'lenmiyor?
Çoğunlukla cevaptaki bir Set-Cookie başlığı, zincirin bir yerindeki private ya da no-store direktifi, ya da her isteği benzersiz cache anahtarı yapan bir sorgu dizesi. Konfigürasyonu değiştirmeden önce gerçek cevap başlıklarını inceleyin.
immutable gerçekten sonsuza kadar mı demek?
"Bu URL'deki gövde değişmeyecek" demektir, yani cache'ler doğrulamayı tümden atlar. Bu yalnızca sürümlü dosya adları için doğrudur. Sonradan üzerine yazacağınız bir URL'e immutable koymak, ziyaretçilerin temiz bir çıkış yolu olmadan eski dosyada takılı kalmasının yoludur.