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

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
| Direktif | Anlamı |
|---|---|
max-age=N | Yanıt N saniye boyunca sunucuya sormadan kullanılabilir. |
s-maxage=N | Yalnı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-cache | Saklanabilir ama her kullanımdan önce sunucuyla doğrulanmalıdır. |
no-store | Hiçbir önbellek yanıtı saklamamalıdır. |
private | Yalnızca tarayıcı saklayabilir; CDN saklayamaz. |
public | Paylaşımlı önbellekler de saklayabilir; Authorization başlıklı isteklere verilen yanıtlarda bu izin özellikle önemlidir. |
must-revalidate | Süre dolduktan sonra doğrulanmadan kullanılamaz; origin'e ulaşılamazsa eski kopya yerine 504 döner. |
immutable | Taze olduğu sürece içerik değişmeyecek; sayfa yenilense bile doğrulama isteği gereksiz. |
stale-while-revalidate=N | Süre dolduktan sonra N saniye boyunca eski kopya hemen sunulur, yenisi arka planda alınır. |
stale-if-error=N | Origin 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-storeNext.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-revalidateChrome 75, Firefox 68 ve Safari 14'ten bu yana tarayıcı önbelleğinde de desteklenir.immutableFirefox 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-stalevemin-freshdirektiflerini büyük tarayıcılar desteklemez. Sert yenileme (Ctrl+Shift+R) isteklereCache-Control: no-cacheekler.
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.

