Müsait — Yerel Dijital Ürünler
HCA · Studio
TR — İletişim ↗
Teknik Not 11 · Dağıtım

Dağıttınız ama ziyaretçi hâlâ eski sayfayı görüyor

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.

Katman
Cloudflare
Belirti
Eski HTML
Kanıt
cf-cache-status
Kısa cevap

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.

Önce tanı

"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ç gidilmedi
  • cf-cache-status: MISS — önbellekte yoktu, sunucudan alındı
  • cf-cache-status: DYNAMIC — bu adres hiç önbelleklenmiyor
  • age: 8412 — cevap önbellekte kaç saniyedir duruyor

HTML 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.

İki ayrı katman

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ı sürümleyin

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 tarafı

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.

Dağıtım sonrası purge

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

Tuzaklar

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.

Özet

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.

Hızlı referans
Tanı
cf-cache-status: HIT önbellekten, MISS sunucudan, DYNAMIC önbelleklenmiyor
Varsayılan
Cloudflare statik varlıkları önbellekler, HTML'i normalde almaz
Varlıklar
Sürümleyin (?v= veya içerik özeti) — purge gerekmez
HTML
max-age=300, must-revalidate ya da hiç önbelleklemeyin
Purge
Dağıtım betiğinin son adımı olmalı, elle yapılan iş değil
Hedefli purge
{"files":[...]} tercih edin; purge_everything kaba araçtır
Sıralama
Önce yükle, sonra purge — tersi eski içeriği yeniden önbelleğe alır
Unutulan
404 cevapları da önbelleklenir; düzelttikten sonra o adresi temizleyin
Sık Sorulan Sorular

Cloudflare ve dağıtım hakkında.

Dosyayı yükledim ama site eski hâlini gösteriyor. Nereden başlamalıyım?

Tahmin 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.

Her dağıtımda purge_everything basmak sakıncalı mı?

Ç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.

Varlıkları sürümlemek purge'e göre neden daha iyi?

Çü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.

Sayfayı düzelttim ama hâlâ 404 veriyor.

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.

Teklif ve Uygunluk

Bir fikriniz mi var?
Yarım cümle de olur.