☁️

Cloudflare Cache Kuralları Analizi

Mevcut 12 kuralın yeni player sistemiyle uyumluluk kontrolü

1 Kritik Hata 1 Eksik Kural 10 Kural OK

📝 Basit Anlatım

Cloudflare, siteyle kullanıcı arasında duran bir ara katman. Dosyaları kendi sunucularında saklayıp (cache) kullanıcılara daha hızlı sunar. 12 kural var — hangi dosyaların cache'leneceğini, hangilerinin her seferinde sunucudan alınacağını belirliyor.

Sorun: HLS playlist dosyaları (.m3u8) her kullanıcı için farklı güvenlik anahtarları içeriyor. Ama Cloudflare bunları 1 yıl cache'liyor — bir kullanıcının anahtarı başka kullanıcıya sunulabilir veya süresi dolmuş anahtar sunulabilir.

Çözüm: Playlist dosyalarını cache'den çıkar, sadece ses parçalarını (.ts segment) cache'le. Zaten P2-10 optimizasyonu ile master.m3u8 artık HTTP isteği bile yapmıyor (inline gömülü).

🔧 Endpoint — Origin Header — CF Kural Eşleşmesi

Endpoint Origin Header CF Kuralı Durum
/api/.../stream (POST) Laravel default K3: API bypass
/api/.../serve (GET) max-age=31536000 K2: MP3 1yıl
/audio/songs/{id}/{exp}/{sig} max-age=31536000, immutable K7: Audio 1yıl
/hls/.../segment-XXX.ts max-age=31536000, immutable K8: HLS 1yıl
/hls/.../playlist.m3u8 no-cache K8: 1yıl ❌ ÇAKIŞMA
/hls/.../master.m3u8 no-cache K8: 1yıl ❌ ÇAKIŞMA
/hls-key/muzibu/songs/{id} max-age=86400, immutable Hiçbiri ⚠️ EKSİK

📋 12 Kural — Detaylı Analiz

K1 — Livewire No Cache Doğru

Livewire AJAX istekleri cache'lenmemeli. Değişiklik gerekmiyor.

K2 — MP3 Audio Cache (1 Yıl) Doğru

/api/muzibu/songs/*/serve — MP3 dosyaları değişmez. K3'ten (API bypass) ÖNCE geldiği için spesifik kural geçerli. Sıralama kritik — değiştirme!

K3 — API No Cache Doğru

Stream API, login, tüm API istekleri cache'lenmez. P2-10 inline master bu endpoint üzerinden gelir — doğru.

K4/K5/K6 — Admin, Dashboard, User Pages No Cache Doğru

Dinamik sayfalar cache'lenmez. Değişiklik gerekmiyor.

K7 — Audio Route Cache (1 Yıl) Doğru

/audio/songs/{id}/{expires}/{sig} — CDN-friendly MP3 endpoint. URL'de expires + signature var, aynı URL = aynı içerik. 1 yıl doğru. Origin: max-age=31536000, immutable — uyumlu.

K8 — HLS Audio Cache (1 Yıl) Düzeltilmeli

Mevcut koşul: /hls/ AND (.ts OR .m3u8 OR .key)

.ts segment → Origin: max-age=31536000, immutable → CF 1yıl → Uyumlu
.m3u8 playlist → Origin: no-cache → CF 1yıl override → ÇAKIŞMA!
⚠️ .key → Artık kullanılmıyor, key'ler /hls-key/ üzerinden sunuluyor → Gereksiz

Problem:

Playlist'ler (.m3u8) içinde signed encryption key URL'leri var. Her kullanıcıya özel expires + token + sig parametreleri içerir. CF "Ignore cache-control" modunda origin'in no-cache header'ını görmezden gelip 1 yıl cache'liyor.

Pratikte CF cache key = full URL (query params dahil) olduğu için her kullanıcı farklı cache key alır → şu an çalışıyor. Ama gereksiz cache kirliliği yaratıyor ve edge case'lerde sorun çıkarabilir.

Önerilen düzeltme:

Kuralı ikiye böl:

K8a — HLS Segments: /hls/ AND .ts → Cache 1 yıl ✅
K8b — HLS Playlists: /hls/ AND .m3u8 → Bypass cache (veya Respect origin = no-cache)

.key pattern kaldırılabilir — artık kullanılmıyor.

K9 — Fonts (1 Yıl) Doğru

Fontlar değişmez. 1 yıl doğru.

K10 — Thumbmaker (1 Ay) İyileştirilebilir

Edge TTL 1 ay var ama Browser TTL ayarlanmamış → her sayfa açılışında CF'ye istek gidiyor. Browser TTL = 7 gün eklenebilir (opsiyonel, öncelik düşük).

K11 — CSS/JS Assets (7 Gün) Doğru

player-core.jsversioned_asset() ile yükleniyor: ?v=1709312345 (file timestamp). Dosya değişince timestamp değişir → farklı cache key → anında güncellenir. 7 gün sorun yok.

K12 — Static Files /storage/ (1 Ay) Doğru

Albüm kapakları, avatarlar vb. Edge 1 ay, browser 7 gün. Uyumlu.

⚠️ Eksik Kural — /hls-key/ Endpoint

Path: /hls-key/muzibu/songs/{id}?expires=...&token=...&sig=...
Fonksiyon: AES-128 şifreleme anahtarını serve eder (16 byte binary)
Origin Header: Cache-Control: public, max-age=86400, immutable
Güvenlik: Signed URL doğrulaması (expires + token + sig HMAC)

Şu an hiçbir CF kuralına denk gelmiyor. CF varsayılan davranışa göre origin header'ı takip ediyor (86400s = 1 gün cache). Signed URL sayesinde her kullanıcı farklı cache key alır — pratikte sorun yok.

Öneri (opsiyonel):

Açıkça tanımlamak istersen: /hls-key/ → Respect origin (max-age=86400) veya Bypass cache. Key 16 byte'lık küçük bir dosya, cache kazancı mininal.

🛠️ Yapılması Gerekenler

YÜKSEK Kural 8'i ikiye böl
Sil:

Mevcut K8 (/hls/ AND (.ts OR .m3u8 OR .key) → 1 yıl)

Ekle:
K8a — HLS Segments Cache (1 Yıl)
Koşul: URI Path contains "/hls/" AND URI Path contains ".ts"
Cache: Eligible → Edge TTL: 1 yıl → Browser TTL: 1 yıl
K8b — HLS Playlists No Cache
Koşul: URI Path contains "/hls/" AND URI Path contains ".m3u8"
Cache: Bypass cache
ORTA Kural 10 — Browser TTL ekle

Thumbmaker'a Browser TTL = 7 gün ekle. Gereksiz origin isteklerini azaltır.

DÜŞÜK (Opsiyonel) /hls-key/ kuralı ekle

Şu an varsayılan davranışla çalışıyor. Açıkça tanımlamak istersen bypass veya respect origin ekle.

📊 Değişiklik Sonrası — Önerilen 13 Kural

# Kural Pattern Cache Edge Browser
1Livewire No Cachestarts_with /livewireBypass
2MP3 Audio Cache/api/.../serve1 yıl1 yıl1 yıl
3API No Cachestarts_with /apiBypass
4Admin No Cachestarts_with /adminBypass
5Dashboard No Cache/dashboard/*Bypass
6User Pages No Cache5 kullanıcı sayfasıBypass
7Audio Route Cache/audio/songs/1 yıl1 yıl1 yıl
8aHLS Segments Cache (YENİ)/hls/ AND .ts1 yıl1 yıl1 yıl
8bHLS Playlists No Cache (YENİ)/hls/ AND .m3u8Bypass
9Fonts.woff/.woff2/.ttf/.otf/.eot1 yıl1 yıl1 yıl
10Thumbmaker (GÜNCELLENDİ)/thumbmaker/1 ay1 ay7 gün
11CSS/JS Assets*.css* / *.js*7 gün7 gün7 gün
12Static Files/storage/1 ay1 ay7 gün

📋 Production Claude'a Verilecek Talimat

Cloudflare Cache Rules — 1 değişiklik gerekli: KURAL 8'İ İKİYE BÖL: Mevcut Kural 8'i SİL (HLS Audio Cache — /hls/ AND (.ts OR .m3u8 OR .key)) Yerine 2 kural ekle: K8a — HLS Segments Cache (1 Year) Koşul: URI Path contains "/hls/" AND URI Path contains ".ts" Expression: (http.request.uri.path contains "/hls/" and http.request.uri.path contains ".ts") Cache Eligibility: Eligible for cache Edge TTL: Ignore cache-control → 1 yıl (status 200 → 1 yıl, status 404 → no cache) Browser TTL: Override origin → 1 yıl K8b — HLS Playlists No Cache Koşul: URI Path contains "/hls/" AND URI Path contains ".m3u8" Expression: (http.request.uri.path contains "/hls/" and http.request.uri.path contains ".m3u8") Cache Eligibility: Bypass cache NEDEN: Playlist (.m3u8) dosyaları içinde signed encryption key URL'leri var. Origin zaten Cache-Control: no-cache dönüyor ama CF "Ignore cache-control" ile bunu ezip 1 yıl cache'liyor. Segment (.ts) dosyaları değişmez, onlar 1 yıl cache'lenebilir. OPSİYONEL: K10 Thumbmaker → Browser TTL = 7 gün ekle (şu an ayarlanmamış). Diğer 10 kural doğru, değişiklik gerekmiyor.
1 Mart 2026 • Muzibu.com.tr