Duruk dosyaları önbelleğe almak, var olan en ucuz hızdır: tarayıcı hiç sormaz bile. Risk ise bunun tersidir — bir yıllığına önbelleğe alınmış, sonra da değiştirmeniz gereken bir biçem dosyası; üstelik ulaşamadığınız bir makinede.

Uzun önbelleklemeyi güvenli kılan kural

YALNIZCA içeriği değiştiğinde adı da değişen dosyaları hırsla önbelleğe alın. O zaman bir değişiklik yeni bir ad demektir, eski önbellek anlamını yitirir ve hiçbir ziyaretçi yanlış dosyayı elinde tutmaz.

/css/site.a1b2c3.css        <- safe to cache for a year
/css/site.css?v=1788541047   <- the same idea, from the file mtime

Ne kurulmalı

location ~* \.(css|js|woff2|jpg|png|webp|svg)$ {
    expires 1y;
    add_header Cache-Control "public, immutable";
}

location ~* \.(html|php)$ {
    add_header Cache-Control "no-cache";
}

immutable, tarayıcıya yeniden doğrulamaya bile kalkışmamasını söyler. HTML üzerindeki no-cache ise "önbelleğe alma" demek değildir; "önce bana sor" demektir — ve bu, adresi değişmeden içeriği değişen bir sayfa için tam da doğrusudur.

Adı sabit kalan bir dosyayı asla uzun süre önbelleğe almayın. Bir yıllığına önbelleğe alınmış /css/site.css, bir yıl boyunca eski tasarımda kalmış ziyaretçiler demektir; ve bu süreyi kısaltmak için sizin tarafınızdan yapılabilecek hiçbir şey yoktur.

Ne gönderdiğinizi denetleyin

curl -sI https://yourdomain.com/css/site.css | grep -iE "cache-control|expires|etag"

ETag ve Last-Modified

Bunlar isteği gereksiz kılmaz, DENETİMİ ucuzlatır: tarayıcı sorar, sunucu 304 Not Modified yanıtını verir ve hiçbir gövde gönderilmez. HTML için iyidir; varlıklar içinse hiç sormamanın ardından gelen ikinci en iyi seçenektir.

Bir CDN'in arkasındayken iki ayrı önbelleği hatırlayın. CDN'i temizlemek, dosyayı bir yıllığına elinde tutan bir tarayıcıya ulaşmaz — adın değişmek zorunda olmasının sebebi de budur.