Dosya sunucuda güncel, tarayıcınızda eski. Sert yenileme yaparsınız, düzelir; gizli sekmede yine eski çıkar. Sorun tarayıcı önbelleği değil, aradaki katmandır — ve çözümü her seferinde purge basmak değildir.
Cloudflare varsayılan olarak statik varlıkları (CSS, JS, görsel, font) önbelleğe alır, HTML'i almaz. HTML de önbelleğe giriyorsa ya bir kural her şeyi önbelleğe al diyordur ya da sunucunuz HTML için uzun bir Cache-Control gönderiyordur. Doğru çözüm iki katmanı ayırmaktır: statik varlıkları dosya adında ya da sorgu dizesinde sürümleyin — böylece hiç purge gerekmez, çünkü yeni sürüm yeni adrestir. HTML'i ise kısa ömürlü tutun ve dağıtım sonrası yalnızca değişen adresleri temizleyin. Tanı için cf-cache-status başlığına bakın: HIT önbellekten, MISS sunucudan, DYNAMIC hiç önbelleklenmiyor demektir.
"Eski sayfa görünüyor" şikâyetinin en az üç ayrı sebebi olabilir: tarayıcı önbelleği, CDN önbelleği ya da sunucunun kendi önbelleği. Hangisi olduğunu tahmin etmek yerine başlıklara sorun:
curl -sSI https://alanadi.com/ | grep -iE 'cf-cache-status|cache-control|age|last-modified'
Okunacak satırlar:
cf-cache-status: HIT — cevap CDN önbelleğinden geldi, sunucunuza hiç gidilmedicf-cache-status: MISS — önbellekte yoktu, sunucudan alındıcf-cache-status: DYNAMIC — bu adres hiç önbelleklenmiyorage: 8412 — cevap önbellekte kaç saniyedir duruyorHTML için HIT ve yüksek bir age görüyorsanız sorun bulunmuştur. DYNAMIC görüyorsanız CDN'i suçlamayın; sorun sunucu tarafındadır.
Statik bir sitede iki farklı içerik türü vardır ve bunların önbellek ihtiyaçları birbirinin tersidir.
Varlıklar (CSS, JS, görsel, font) nadiren değişir ve değiştiğinde tamamen değişir. Bunlar mümkün olan en uzun süre önbellekte kalmalıdır.
HTML sık değişir ve değiştiğinde hemen görünmelidir. Bu yüzden ya hiç önbelleklenmemeli ya da çok kısa süre tutulmalıdır.
Çoğu dağıtım sorunu, bu ikisine aynı politikanın uygulanmasından doğar. "Her şeyi önbelleğe al" kuralı siteyi hızlandırır ama her güncellemeyi görünmez kılar; "hiçbir şeyi önbelleğe alma" ise CDN'i anlamsızlaştırır.
Varlıklar için doğru çözüm purge değil, adres değiştirmektir. Dosyanın içeriği değiştiğinde adresi de değişirse, önbellekte duran eski sürümün hiçbir önemi kalmaz — kimse onu istemez.
<link rel="stylesheet" href="/styles.min.css?v=20260918" />
<script src="/script.min.js?v=20260918" defer></script>
Daha sağlamı, sürüm dizesini dosya içeriğinin özetinden üretmektir; böylece sürüm bump'ı unutmak imkânsız hâle gelir. Hangi yöntemi kullanırsanız kullanın, kritik nokta şudur: varlık adresi değişmeden varlık içeriği değişmemelidir.
Bu kural tutulduğunda varlıklara bir yıllık önbellek süresi vermek tamamen güvenlidir ve dağıtım sonrası onlar için purge gerekmez.
Sürüm bump'ını unutmak, bu düzenin tek zayıf noktasıdır. CSS'i güncelleyip sürümü değiştirmezseniz ziyaretçiler yeni HTML ile eski stili alır ve sayfa bozuk görünür — sıradan bir purge bile bunu çözmez, çünkü tarayıcı dosyayı kendi önbelleğinden veriyordur.
HTML için iki makul seçenek vardır. Birincisi hiç önbelleklememektir; CDN yalnızca TLS sonlandırma ve koruma katmanı olarak çalışır. İkincisi kısa bir süre tanımaktır — birkaç dakika, yeniden doğrulamayla birlikte.
Sunucu tarafında kısa ömür şöyle tanımlanır:
Cache-Control: public, max-age=300, must-revalidate
Bu başlık hem tarayıcıya hem CDN'e aynı şeyi söyler ve dağıtımdan en fazla beş dakika sonra herkes yeni içeriği görür. Sayfaların zaten ETag ve Last-Modified başlıkları varsa, süre dolduğunda yapılan kontrol ucuzdur: değişmediyse gövde yeniden indirilmez.
Varlıklar sürümlüyse purge yalnızca HTML için gerekir ve dağıtım betiğinin son adımı olmalıdır — elle yapılan bir iş değil.
# Yalnızca değişen adresleri temizle
curl -sS -X POST \
"https://api.cloudflare.com/client/v4/zones/$ZONE/purge_cache" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
--data '{"files":["https://alanadi.com/","https://alanadi.com/hizmetler/"]}'
Tümünü temizlemek (purge_everything) kolaydır ama kaba bir araçtır: bütün varlıklar da önbellekten düşer, sonraki ziyaretçiler her şeyi yeniden indirir ve sunucunuz gereksiz yük alır. Küçük sitelerde fark edilmez, trafikli sitelerde edilir.
Purge'den sonra sonucu doğrulayın — bir kez daha, varsaymayın:
curl -sSI https://alanadi.com/ | grep -i cf-cache-status # MISS bekleriz
Geliştirme modu. Cloudflare'in geliştirme modu önbelleği geçici olarak devre dışı bırakır ve birkaç saat sonra kendiliğinden kapanır. Hata ayıklarken faydalıdır; açık unutulduğunda "site yavaşladı" şikâyetinin sebebi olur.
404 sayfası da önbelleklenir. Yanlışlıkla eksik dağıtılan bir sayfa 404 dönerse, bu 404 önbelleğe girer. Dosyayı sonradan yüklediğinizde adres hâlâ 404 vermeye devam eder; o adresi ayrıca temizlemek gerekir.
Sıralama önemlidir. Önce dosyaları yükleyin, sonra purge edin. Ters sırada yaparsanız CDN eski içeriği yeniden önbelleğe alır ve hiçbir şey değişmemiş gibi görünür.
Sunucu başlığı CDN'i yönlendirir. HTML için uzun bir Cache-Control gönderiyorsanız, CDN kuralı ne olursa olsun tarayıcılar dosyayı kendilerinde tutar. Purge tarayıcı önbelleğini temizlemez.
Dağıtım sonrası eski içerik görmek bir önbellek arızası değil, politika eksikliğidir. Varlıkları sürümleyin ve uzun süre önbellekte tutun; HTML'i kısa tutun ve dağıtım betiğinin son adımında hedefli purge yapın. Bu ikisi yerine oturduğunda "purge basmayı unuttum" sınıfı hatalar tamamen ortadan kalkar — ve ne olduğunu anlamak için her zaman tek bir başlık yeter: cf-cache-status.
cf-cache-status: HIT önbellekten, MISS sunucudan, DYNAMIC önbelleklenmiyor?v= veya içerik özeti) — purge gerekmezmax-age=300, must-revalidate ya da hiç önbelleklemeyin{"files":[...]} tercih edin; purge_everything kaba araçtırTahmin etmeden başlıklara bakın: curl -sSI ile cf-cache-status, age ve cache-control satırlarını okuyun. HIT ve yüksek age görüyorsanız cevap CDN önbelleğinden geliyordur. DYNAMIC görüyorsanız CDN'in ilgisi yoktur, sorun sunucu veya tarayıcı tarafındadır. Bu tek komut üç olasılığı birbirinden ayırır.
Çalışır ama kaba bir araçtır. Bütün varlıklar da önbellekten düşer, sonraki ziyaretçiler CSS'ten görsellere kadar her şeyi yeniden indirir ve sunucunuz gereksiz yük alır. Varlıklarınız sürümlüyse zaten temizlenmelerine gerek yoktur; yalnızca değişen HTML adreslerini hedefleyin.
Çünkü yarış koşulunu ortadan kaldırır. Sürümlü bir adres değiştiğinde yeni dosya yeni adrestir; önbellekte duran eski sürümü kimse istemez, dolayısıyla temizlenmesi de gerekmez. Bu sayede varlıklara bir yıllık önbellek süresi vermek güvenli hâle gelir ve dağıtım tek bir değişkene indirgenir: sürümü bump etmeyi unutmayın.
404 cevapları da önbelleğe alınır. Eksik dağıtılmış bir adres bir kez 404 döndüyse, dosyayı sonradan yüklemeniz yetmez; o adresin önbellekteki 404 cevabını ayrıca temizlemeniz gerekir. Dağıtım sonrası doğrulamayı yalnızca ana sayfada değil, yeni eklenen adreslerde de yapın.