Tarayıcı Cache (Browser Cache) Nasıl Yapılandırılır? Net Rehber
Browser cache’i doğru ayarlayın: cache kontrol başlıkları, süresi, sürümleme ve temizleme stratejileriyle kullanıcı hızını ve yük maliyetini düşürün.
Browser cache (tarayıcı önbelleği) doğru yapılandırıldığında, aynı ziyaretlerde sayfa ve görsel gibi dosyaların tekrar tekrar indirilmesini azaltır. Sonuç olarak kullanıcı tarafında TTFB/TBT benzeri gecikmeler düşer, sunucu ve bant genişliği maliyeti azalır. Bu rehberde; cache mantığını, HTTP header’larını (Cache-Control, ETag), dosya sürümleme yaklaşımını ve pratikte nasıl doğrulayacağınızı adım adım göreceksiniz.
Browser cache neyi çözer, neyi çözmez?
Browser cache’in amacı, statik kaynakları (JS, CSS, görseller, fontlar) yeniden indirmek yerine tarayıcıda saklamaktır. Ancak her şeyi cache’lemek doğru değildir.
Cache’lemenin doğru hedefi: statik dosyalar
Aşağıdaki içerikler genellikle uzun süreli cache ile uyumludur: - JS ve CSS dosyaları - Görseller (png, jpg, webp, svg) - Fontlar (woff2 vb.) - Kullanıcı değişmeyen statik asset’ler
Bu dosyalarda kritik nokta şudur: Dosya adı değişmedikçe tarayıcı eski sürümü tutabilir. Bu yüzden dosya sürümleme (hash ile isimlendirme) gerekir.
Cache’lememeniz gerekenler: sık değişen içerik
Aşağıdakiler çoğu senaryoda kısa cache veya hiç cache olmadan yönetilmelidir: - HTML sayfaları - Dinamik içerik üreten API yanıtları - Kullanıcıya özel sayfalar (oturum, kişisel veriler)
Burada amaç; güncellemelerin “beklemeden” görünmesini sağlamaktır. HTML için kısa süreli cache + “asset’leri uzun süre cache’le” yaklaşımı pratikte en dengeli yöntemdir.
Cache-Control başlıkları: pratikte doğru kombinasyonlar
Browser cache’in kalbi HTTP yanıt başlıklarıdır. En çok kullanılanları Cache-Control, bazen ETag ve ek olarak Last-Modified olur.
Cache-Control: en net kontrol
Sık kullanılan ayarlar: - public: Yanıt proxy/cache altyapıları tarafından da cache’lenebilir. - private: Sadece tarayıcı (client) önbelleğine uygundur. - max-age=SECONDS: Cache’in ne kadar süre geçerli olduğunu belirler. - no-cache: Cache’lenebilir ama her istek öncesi doğrulama gerekir (yeniden indirilmeyebilir). - no-store: Hiç saklama. - must-revalidate: Cache geçerliliği dolunca doğrulama zorunlu.
Örnek politika tablosu
Aşağıdaki tablo, dosya türüne göre “net” bir başlangıç çerçevesi verir:
| Kaynak türü | Hedef davranış | Önerilen Cache-Control |
|---|---|---|
| JS/CSS (hash ile isimlendirilmiş) | Uzun süre yeniden indirme yok | public, max-age=31536000, immutable |
| Görsel/font (hash ile isimlendirilmiş) | Uzun süre yeniden indirme yok | public, max-age=31536000, immutable |
| HTML (sık güncellenen) | Yeni sürüm hızlı gelsin | public, max-age=60 veya no-cache |
| API (JSON, dinamik) | Kullanım senaryosuna göre | Çoğu durumda private, max-age=0, must-revalidate |
| Yönetim ekranları | Hassas içerik | private, no-store |
Not: immutable güncel tarayıcılarda “dosya adı değişmeyecek” varsayımıyla birlikte çalışır. Bu nedenle sadece hash’lenmiş statik dosyalarda kullanın.
ETag: doğrulama (revalidation) maliyetini yönetme
ETag ile tarayıcı, cache’teki içeriğin hâlâ aynı olup olmadığını sorar. Bu sayede içerik değişmediyse veri boyutu büyük olsa bile tam indirme olmayabilir.
- HTML için no-cache kullanmak, doğrulamayı zorunlu kılar.
- Statik dosyalarda ise sürümleme yaptığınız için çoğu zaman doğrulama ihtiyacını minimuma indirirsiniz (uzun max-age + immutable).
Dosya sürümleme (hash) olmadan uzun cache risktir
En sık yapılan hata: “max-age’i 1 yıl yaptım, hızlandı” zannedip dosya adını değiştirmeden güncelleme yapmaktır. Kullanıcılar eski dosyayı cache’ten çeker.
En doğru yaklaşım: filename’de içerik hash’i
Örnek mantık:
- app.4f3a9c2.js
- styles.a19bd0c.css
Yeni deploy olduğunda hash değişir, dosya adı değiştiği için tarayıcı yeni dosyayı ister. Bu sayede uzun cache ile güncellemeleri aynı anda garanti edersiniz.
Uygulama tarafı: build pipeline şart
Build pipeline şu üç ihtiyacı karşılamalıdır: - Hash’li asset üretimi - HTML içinde doğru referansı otomatik güncelleme - Servis tarafında hash’li dosyaları uzun cache’te tutma
Taraf bağımsız kurulum: “Tarayıcı tarafında cache” ile “sunucu header’ı” karışmasın
Bazı kullanıcılar “tarayıcı ayarlarından cache’i ayarlayayım” diye düşünür. Bu kontrol tek tek kullanıcıda garanti edilemez.
NetKıyas açısından en sağlıklı yöntem: - Tarayıcı davranışını belirleyen asıl kaynak: sunucunun HTTP response header’ları - Tarayıcı tarafı: geliştirme ve test içindir (ör. DevTools ile boşaltma)
Sunucu/Proxy tarafında header uygulama: net örnekler
Aşağıdaki örnekler, statik dosya türlerinde uzun cache vermek için başlangıç komutlarıdır. Kullandığınız teknolojiye göre uyarlayın.
Nginx örneği (statik dosyalar)
location ~* \.(js|css|png|jpg|jpeg|gif|webp|svg|woff2|woff)$ {
expires 1y;
add_header Cache-Control "public, max-age=31536000, immutable";
}
location / {
add_header Cache-Control "public, max-age=60";
}
Apache örneği (mod_headers)
<IfModule mod_headers.c>
<FilesMatch "\.(js|css|png|jpg|jpeg|gif|webp|svg|woff2|woff)$">
Header set Cache-Control "public, max-age=31536000, immutable"
</FilesMatch>
<FilesMatch "\.html$">
Header set Cache-Control "public, max-age=60"
</FilesMatch>
</IfModule>
CDN varsa: iki katman birlikte düşünülür
CDN kullanıyorsanız hem CDN cache politikasını hem de origin header’larını kontrol edin. - Origin’de uzun cache verdiniz ama CDN “override” uyguluyorsa davranış değişir. - Purge/invalidate mekanizması: hash’li dosyalarda genelde purge ihtiyacı azalır.
Doğrulama: “Cache-Control doğru mu?” nasıl kanıtlanır?
Cache ayarları teoride değil, log/başlık doğrulamasıyla netleşir.
Chrome/Firefox DevTools ile kontrol
- Geliştirici araçlarını açın (F12).
- Network sekmesine gidin.
- Sayfayı hard refresh yapın (geliştirici aracına göre değişir).
- Yeniden yüklenen isteklerde response headers altında şunları arayın:
- Cache-Control doğru mu?
- Yanıt
immutableiçeriyor mu? - HTML için max-age kısa mı? - Aynı sayfayı tekrar açın. - Uzun cache’li dosyalarda “from disk cache”/“from memory cache” veya beklenen cache davranışı görülmelidir.
Curl ile header kontrolü
Örnek akış:
- Asset için:
- Cache-Control içinde max-age=31536000 ve immutable doğrulayın.
- HTML için:
- max-age 60 gibi kısa bir değer veya no-cache doğrulayın.
Komut formatı (örn.):
- curl -I https://site.example/app.a19bd0c.css
Cache temizleme (purge) ve sorun giderme: net karar ağaçları
Cache politikasını kurduktan sonra iki tür problem çıkar: “Kullanıcı eski dosya görüyor” ve “Hâlâ yavaş, cache çalışmıyor”.
Problem 1: Kullanıcı eski JS/CSS görüyor
Doğru kontrol sırası: 1. Dosya sürümleme var mı? (hash’li dosya adı değişiyor mu?) 2. HTML içinde eski referans kalıyor mu? 3. Cache-Control uzun mu ve immutable var mı? 4. CDN purge gerekiyor mu? (özellikle proxy override varsa)
Net çözüm: Dosya hash’i değişmiyorsa uzun cache doğru değildir. Hash ile isimlendirmeyi etkinleştirin.
Problem 2: Cache çalışmıyor, her seferinde yeniden indiriyor
Kontrol listesi:
- Response’larda Cache-Control gerçekten dönüyor mu?
- Vary başlığı (ör. Vary: Accept-Encoding) kontrolü: uygulama yanlış Vary ile gereksiz varyant üretiyor olabilir.
- Uygulama katmanı (framework) her istekte header’ı override ediyor mu?
- CDN/Load balancer origin header’ı değiştiriyor mu?
Net çözüm: Static asset route’larında sabit bir header set edin, uygulama üzerinden dinamik override’u kaldırın.
Optimizasyon hedefleri: ölçüm olmadan “cache yaptım” denmez
Cache ayarlarının etkisini sayısal ölçümle doğrulayın: - İlk yükte indirme boyutu: değişmez (assets yine gelir) - İkinci/sonraki yükte istek sayısı ve toplam indirme: düşmelidir - Network waterfall: özellikle JS/CSS yeniden indirme yoksa belirgin kısalır
Kılavuz bir hedef: - Hash’li statik dosyalar için tekrar ziyaretlerde “tam dosya indirme” yerine cache’ten servis görülmeli. - HTML için max-age kısa tutularak kullanıcı güncellemeleri hızlı görmeli.
Sonuç: Net bir yapı kuralı ile ilerleyin
Browser cache’i doğru kurmanın net formülü şudur: HTML’i kısa cache/ doğrulamalı yönet, hash’li statik asset’leri uzun cache + immutable ile servis et, sonra DevTools/curl ile header’ları doğrula. Kurulumu tamamladıktan sonra ilk iki deploy’da değişen dosyaların adlarının gerçekten güncellendiğini teyit edin. Bu üç adımı uyguladığınızda cache performansı “tahminle” değil “ölçümle” ilerler.
İsterseniz mevcut stack’inizi (Nginx/Apache/CDN, framework, asset hash var mı) yazın; ona göre size uygun net Cache-Control setini birlikte çıkarabilirim.
Hosting karşılaştırması yapmaya hazır mısın?
100+ firmanın fiyatlarını tek tıkla karşılaştır, en uygun paketi bul.
Hosting Karşılaştır →İlgili Yazılar
WooCommerce Hosting’de Yüksek Trafiği Kaldırma Rehberi
WooCommerce’te yüksek trafiği güvenli ve hızlı yönetmek için cache, CDN, veritabanı, ölçekleme ve test adımlarını net karşılaştırmalarla öğrenin.
SSH Key ile Şifre Girişi Devre Dışı: Net Güvenlik Rehberi
SSH key kullanarak şifre tabanlı girişi devre dışı bırakın. Doğru ayar dosyaları, doğrulama adımları ve kilitlenmeyi önleyen yöntemleri görün.
TTFB (Time to First Byte) Nedir? Nasıl Düşürülür?
TTFB (Time to First Byte) nedir, ölçümü nasıl yapılır ve hosting/VDS tarafında hangi ayarlarla düşürülebilir? Net teşhis adımları.
İlk domain yatırımı için mantıklı uzantılar: Net karşılaştırma
İlk domain yatırımında hangi uzantılar daha mantıklı? .com, .net, .org, ülke uzantıları ve yeni TLD’lerin SEO/marka etkilerini net kıyaslayın.