İletişim

Cache-Control Nedir?

Kısa tanım

Cache-Control, bir HTTP yanıtının tarayıcı ve CDN gibi önbelleklerde saklanıp saklanamayacağını, ne kadar süre taze sayılacağını ve süresi dolduğunda nasıl yeniden doğrulanacağını belirleyen HTTP başlığıdır. Değeri max-age, s-maxage, no-cache, no-store, private, immutable ve stale-while-revalidate gibi virgülle ayrılmış direktiflerden oluşur. İsteklerde de kullanılabilir, ancak asıl önbellek politikası yanıt başlığıyla tanımlanır.

Diğer adları: Cache-Control başlığı, Cache-Control header, önbellek başlığı, max-age, s-maxage, stale-while-revalidate

Önbelleğe alınan yanıtın max-age süresince taze kullanıldığını, süre dolunca bayatlayıp 304 ile yeniden doğrulandığını gösteren zaman çizelgesi

Bir başlık, birden fazla önbellek

Bir yanıt kullanıcıya ulaşana kadar en az iki tür önbellekten geçebilir: kullanıcıya özel olan tarayıcı önbelleği (private cache) ve birçok kullanıcıya hizmet veren paylaşımlı önbellekler (shared cache), yani CDN'ler ve reverse proxy'ler. Cache-Control bu katmanların her birine aynı başlıkla talimat verir; bazı direktifler hepsini, bazıları yalnızca paylaşımlı önbellekleri ilgilendirir.

Başlığın değeri virgülle ayrılmış direktiflerden oluşur ve sıra önemli değildir. Direktifler çelişirse en kısıtlayıcı olan geçerli olur: no-store varsa diğerlerinin bir anlamı kalmaz. Bir ayrıntı daha: max-age yanıtın tarayıcıya ulaştığı andan değil, origin sunucuda üretildiği andan itibaren sayılır. Bir CDN'de 300 saniye beklemiş yanıt age: 300 başlığıyla gelir ve max-age=600 ise tarayıcıda yalnızca 300 saniye daha taze kalır.

Yanıt direktifleri

DirektifAnlamı
max-age=NYanıt N saniye boyunca sunucuya sormadan kullanılabilir.
s-maxage=NYalnızca paylaşımlı önbellekler için ömür; onlar için max-age değerini geçersiz kılar, tarayıcı bu direktifi yok sayar.
no-cacheSaklanabilir ama her kullanımdan önce sunucuyla doğrulanmalıdır.
no-storeHiçbir önbellek yanıtı saklamamalıdır.
privateYalnızca tarayıcı saklayabilir; CDN saklayamaz.
publicPaylaşımlı önbellekler de saklayabilir; Authorization başlıklı isteklere verilen yanıtlarda bu izin özellikle önemlidir.
must-revalidateSüre dolduktan sonra doğrulanmadan kullanılamaz; origin'e ulaşılamazsa eski kopya yerine 504 döner.
immutableTaze olduğu sürece içerik değişmeyecek; sayfa yenilense bile doğrulama isteği gereksiz.
stale-while-revalidate=NSüre dolduktan sonra N saniye boyunca eski kopya hemen sunulur, yenisi arka planda alınır.
stale-if-error=NOrigin 500, 502, 503 veya 504 döndürürse eski kopya N saniye daha kullanılabilir.

no-cache ile no-store karıştırılmamalı

En yaygın yanlış anlama isimden kaynaklanır. no-cache “önbelleğe alma” demek değildir; “sakla ama kullanmadan önce sor” demektir. Tarayıcı kayıtlı ETag'i gönderir, içerik değişmemişse sunucu gövdesiz bir 304 Not Modified ile yanıt verir. Sık güncellenen HTML sayfaları için idealdir. Gerçekten hiçbir yerde iz kalmasın isteniyorsa (ödeme onayı, kişisel belgeler, tek kullanımlık tokenlar) doğru direktif no-store'dur. HTTP/1.0 dönemi önbelleklerle uyum gerekiyorsa max-age=0, must-revalidate ikilisi no-cache ile aynı sonucu verir. Bir not: geri/ileri önbelleği (bfcache) sayfanın tamamını hafızada tuttuğu için bu direktifler “Geri” tuşuyla dönüşte yeniden doğrulamayı garanti etmez.

CDN'e ayrı, tarayıcıya ayrı ömür

Paylaşımlı önbellek ile tarayıcıya farklı süre vermek, Cache-Control'ün en güçlü kullanımlarından biridir:

# Ürün listesi API'si: tarayıcıda 1 dk, CDN'de 5 dk; süre dolunca
# 1 dk boyunca eski kopya sunulurken arka planda yenilenir
Cache-Control: public, max-age=60, s-maxage=300, stale-while-revalidate=60

# Giriş yapmış kullanıcının hesap sayfası
Cache-Control: private, no-cache

# Origin çökerse bir güne kadar eski kopya kabul
Cache-Control: max-age=600, stale-if-error=86400

# Tek kullanımlık doğrulama kodu içeren yanıt
Cache-Control: no-store

Next.js'teki ISR gibi “önce eskiyi göster, arkada yenile” yaklaşımları da aynı fikre dayanır. Bazı CDN'ler yalnızca kendilerine yönelik ayrı başlıkları da tanır; CDN-Cache-Control bunun standartlaşmış örneğidir (RFC 9213). Varsayılan davranışlar sağlayıcıdan sağlayıcıya değiştiği için CDN'inizin hangi direktiflere uyduğunu kendi dokümantasyonundan doğrulayın.

Tarayıcı desteğinde dikkat edilecekler

  • stale-while-revalidate Chrome 75, Firefox 68 ve Safari 14'ten bu yana tarayıcı önbelleğinde de desteklenir.
  • immutable Firefox ve Safari'de desteklenir; Chrome bu direktifi uygulamaz. Chrome normal yenilemede taze alt kaynakları zaten yeniden doğrulamadığı için pratik fark küçüktür.
  • İstek tarafındaki max-stale ve min-fresh direktiflerini büyük tarayıcılar desteklemez. Sert yenileme (Ctrl+Shift+R) isteklere Cache-Control: no-cache ekler.

Bir yanıtın Cache-Control değerini tarayıcının Network panelinde görebilirsiniz. Önbelleğin genel mantığı tarayıcı önbelleği maddesinde, direktiflerin tam listesi MDN'de yer alır. SEO Analiz Aracı da sayfa yanıtının Cache-Control başlığını listeler.

İlgili terimler

← Sözlüğe dön