Loading...

Performans · 9 dk okuma

Cache-Control ve max-age: pratik rehber

Cache-Control, tarayıcılara ve CDN'lere bir cevabı ne kadar süre yeniden kullanabileceklerini söyleyen başlıktır. Doğru ayarlarsanız tekrar ziyaretler anında açılır ve origin'iniz sessiz kalır; yanlış ayarlarsanız ya bir yıl boyunca bayat sayfa sunarsınız ya da cache'lemeyi tümden çöpe atarsınız. Bu rehber her direktifi sade dille anlatır ve hemen her siteyi kapsayan üç durum için hazır reçeteler verir.

Güncellendi

Cache-Control ve max-age: pratik rehber

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.