HTTP Cache Doğrulama: ETag, Last-Modified ve Cache-Control Rehberi
HTTP Cache Doğrulama: ETag, Last-Modified ve Cache-Control Rehberi
Son Güncelleme: Mayıs 2026
HTTP önbellekleme performans, bant genişliği tasarrufu ve kullanıcı deneyimi için kritik bir tekniktir. Bu makalede ETag, Last-Modified ve Cache-Control başlıklarının (headers) nasıl çalıştığını, CDN ve reverse proxy ile etkileşimlerini, Nginx/Apache örneklerini ve sık karşılaşılan sorunların çözüm yollarını pratik örneklerle öğreneceksiniz.
İçindekiler
- HTTP Cache Nedir?
- Cache Headers ve Amaçları
- ETag vs Last-Modified Karşılaştırması
- CDN ile Uyum ve Öncelikler
- Nginx Örnek Konfigürasyonlar
- Apache Örnek Konfigürasyonlar
- Dinamik İçerik ve Cache Doğrulama
- Sorun Giderme ve İpuçları
- Sıkça Sorulan Sorular
- Sonuç
HTTP Cache Nedir?
Önbellekleme (caching), sunucu ve istemci (tarayıcı/CDN/proxy) arasında tekrar eden veri transferlerini azaltmak için kullanılan bir tekniktir. HTTP protokolü, kaynakların (ör. CSS, JS, HTML, API yanıtları) hangi koşullarda yeniden getirileceğini belirlemek için başlıklar sağlar. Bu başlıklar, performans ve kaynak tüketimi açısından doğru şekilde yapılandırılmalıdır.
Cache Headers ve Amaçları
En yaygın kullanılan başlıklar şunlardır:
- Cache-Control: İstemci ve ara katmanlara (proxy/CDN) önbellekleme politikalarını belirler.
- ETag: Kaynağın benzersiz sürümünü belirten etiket. Koşullu isteklere (conditional requests) olanak sağlar.
- Last-Modified: Kaynağın son değişiklik tarihini belirtir; istemci bu tarihe göre doğrulama yapabilir.
- Expires: Kaynağın geçerlilik süresini mutlak zaman olarak belirtir (Cache-Control varken genellikle birlikte kullanılmaz).
ETag vs Last-Modified Karşılaştırması
İki temel doğrulama mekanizması vardır: ETag ve Last-Modified. Her ikisi de istemcinin sunucuya gereksiz veri talep etmesini engelleyebilir; farkları ve avantajları aşağıdaki tabloda özetlenmiştir.
| Özellik | ETag | Last-Modified |
|---|---|---|
| Açıklama | Kaynağın benzersiz sürüm etiketi (genellikle hash veya inode/timestamp kombinasyonu). | Kaynağın son değişiklik zamanı (HTTP-date formatı). |
| Doğruluk | Yüksek (byte seviyesinde değişiklikleri algılar). | Zaman hassasiyeti nedeniyle bazı değişiklikleri kaçırabilir (ör. aynı saniyede yapılan değişiklikler). |
| Maliyet | Üretimi için hesaplama veya dosya meta verisi gerektirebilir. | Dosya sistemi timestamp ile kolaydır, ek maliyet düşük. |
| CDN/Proxy Uyumluluğu | Çoğu CDN destekler; fakat CDN cache key politikaları etkileyebilir. | Genellikle sorunsuz çalışır, ancak saat uyumsuzlukları sorun yaratabilir. |
Pratik tavsiye: Statik varlıklar için Cache-Control ile uzun süreli önbellekleme ve sürümleme (filename sürümlendirme) tercih edin; dinamik veya sık değişen içerikler için ETag veya Last-Modified ile koşullu doğrulama sağlayın.
CDN ile Uyum ve Öncelikler
CDN kullanıyorsanız önbellekleme mantığınızı CDN'nin davranışına göre ayarlamalısınız. CDN'ler genelde Cache-Control ve Expires başlıklarını referans alır; bazı CDN'ler ETag'i göz ardı edebilir veya kendi cache key'ini kullanabilir.
- Origin kontrolü: Origin sunucunuzda doğru başlıkları göndermek CDN davranışını şekillendirir.
- Cache-key: CDN'nin hangi öğeyi cache'leyeceğini belirler — host, path, query string ve başlıklara göre değişebilir.
- Heuristic TTL: CDN'ler bazen eksik başlıklar için heuristic TTL uygulayabilir; bu, beklenmeyen cache süresine yol açabilir.
CDN ile çalışırken özellikle dikkat edilmesi gerekenler:
- Statik içerik: Uzun TTL + dosya ismine sürüm ekleme (ör.
app.v1.2.3.js). - API ve HTML: Kısa TTL veya koşullu doğrulama (ETag/Last-Modified) tercih edin.
- Cache Invalidation: CDN cache temizleme (purge) süreçlerini ve maliyetini planlayın.
Nginx Örnek Konfigürasyonlar
Aşağıda sık kullanılan Nginx örnekleri yer almaktadır. Statik dosyalar için agresif Cache-Control, HTML için koşullu doğrulama önerilir.
Statik dosyalar için uzun TTL
location ~* \.(js|css|png|jpg|jpeg|gif|svg|webp|avif)$ {
expires 30d;
add_header Cache-Control "public, max-age=2592000, immutable";
}
HTML için ETag devre dışı, Last-Modified bırakma
ETag bazen Nginx ve upstream arasında çakışma yaratır; HTML için Last-Modified yeterli olabilir.
location / {
add_header Cache-Control "no-cache, must-revalidate";
add_header Last-Modified $date_gmt;
etag off;
}
ETag üretimi (dosya sistemi tabanlı)
Nginx doğrudan ETag üretmez; çoğu durumda backend (ör. PHP/FastCGI) ETag döndürür. Ancak dosya sunucularında sendfile ve dosya metadatası ile beraber doğru yapılandırma önemlidir.
Apache Örnek Konfigürasyonlar
Apache, mod_expires ve mod_headers ile önbellekleme yönetimini kolaylaştırır. Ayrıca mod_headers ile ETag / Last-Modified davranışı değiştirilebilir.
mod_expires ile örnek
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/png "access plus 30 days"
ExpiresByType text/css "access plus 7 days"
</IfModule>
ETag kontrolü
# ETag'i devre dışı bırakmak için
FileETag None
# veya sadece inode/time/size kombinasyonunu ayarlamak için
FileETag MTime Size
Dinamik İçerik ve Cache Doğrulama
Dinamik içerik (ör. kullanıcıya özel HTML, API yanıtları) için önbellekleme stratejisi uygulamak daha dikkat gerektirir. Aşağıdaki yaklaşımlar uygulanabilir:
- Cache-Control:
privateveyano-storeile kullanıcı bazlı verilerin proxy/CDN tarafında cachelenmesini engelleyin. - Koşullu GET: API yanıtları için ETag üreterek istemcilerin yalnızca değişiklik varsa tam içerik indirmesini sağlayın.
- Fragment cache: Büyük sayfalarda sabit ve değişen bölümleri ayrı cache katmanlarında saklayın.
Örnek: Basit bir PHP yanıtında ETag oluşturma:
// PHP örneği
$data = get_api_data();
$etag = md5(json_encode($data));
header("ETag: \"$etag\"");
if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && trim($_SERVER['HTTP_IF_NONE_MATCH']) == "\"$etag\"") {
header("HTTP/1.1 304 Not Modified");
exit;
}
echo json_encode($data);
Sorun Giderme ve İpuçları
Önbellekleme ile ilgili sık karşılaşılan sorunlar ve çözümleri:
- Beklenmeyen eski içerik: CDN veya reverse proxy cache'ini purge (temizle) edin; Cache-Control başlıklarını kontrol edin.
- ETag değişmiyor: ETag üretiminde kullanılan algoritma veya kaynak sürümlendirmesini gözden geçirin.
- Saat uyumsuzluğu: Last-Modified başlıkları sunucular arası saat farkı yüzünden hatalı olabilir; NTP ile saat senkronizasyonu sağlayın.
- Vary başlığı:
Varydoğru ayarlanmazsa farklı kullanıcı ajanları veya başlıklara göre cache hataları oluşur. Örneğin dil başlığı içinVary: Accept-Languagekullanılmalıdır. - HTTPS & CDN: CDN ile TLS offload yapılıyorsa origin-connector başlıklarının korunmasına dikkat edin (ör.
X-Forwarded-Proto).
Aşağıdaki komutlar ile header testleri yapabilirsiniz:
# Kaynağın header'larını görüntüleme
curl -I https://example.com/app.v1.2.3.js
# Koşullu istekte bulunma (If-None-Match)
curl -H "If-None-Match: \"abcdef\"" -I https://example.com/data.json
Sıkça Sorulan Sorular
ETag nedir ve neden kullanmalıyım?
ETag, bir kaynağın sürümünü temsil eden benzersiz bir etiketir. ETag sayesinde istemci, sunucudan kaynağın değişip değişmediğini sorgulayabilir; değişmemişse sunucu 304 Not Modified döner ve veri transferi azalır.
Last-Modified ile ETag arasından hangisini seçmeliyim?
Her ikisi de kullanılabilir. Last-Modified daha basit ve düşük maliyetliyken, ETag byte seviyesinde doğruluk sağlar. Kritik dosyalar için ETag, genel kullanım için Last-Modified yeterli olabilir.
Cache-Control ve Expires arasındaki fark nedir?
Cache-Control modern ve terci edilen yaklaşımdır; directive'lerle (max-age, public, private, immutable) daha esnek kontrol sağlar. Expires ise mutlak zaman belirtir ve legacy desteği içindir.
CDN'im ETag'i göz ardı ediyorsa ne yapmalıyım?
CDN sağlayıcınızın dokümantasyonunu kontrol edin; bazı CDN'ler ETag yerine kendi cache-key ve sürümleme yöntemlerini kullanır. Bu durumda dosya isminde sürümleme yaparak (cache-busting) sorunu çözebilirsiniz.
Dinamik API yanıtlarını nasıl güvenli şekilde cache'lerim?
API yanıtları için Cache-Control: private, max-age=0, must-revalidate veya ETag ile koşullu GET kullanabilirsiniz. Ayrıca kullanıcıya özel verileri proxy/CDN tarafında cachelemeden önce Vary ve kimlik doğrulama başlıklarını doğru ayarlayın.
Sonuç
Doğru HTTP önbellekleme stratejisi uygulamak web uygulamanızın hızını ve verimliliğini doğrudan artırır. Statik varlıklar için uzun TTL ve sürümleme, dinamik içerikler için ETag/Last-Modified ve koşullu doğrulama en iyi uygulamalardır. CDN kullanıyorsanız, CDN davranışını ve cache-key ayarlarını mutlaka doğrulayın.
Corelux'un Hosting ve Türkiye VPS Sunucu hizmetleri ile performans odaklı altyapı tercih edebilir veya yüksek kaynak gereksinimleriniz için Kiralık Sunucu seçeneklerini inceleyebilirsiniz. Daha özel ihtiyaçlar için SSL Sertifikası ve Yedekleme Hizmeti sayfalarımız yardımcı olacaktır.
Uygulamanıza özgü öneri isterseniz, kullandığınız web sunucusunun (Nginx/Apache), CDN sağlayıcınızın ve uygulama tipinizin bilgilerini paylaşın; size adım adım öneriler hazırlayayım.
Yazar
Boran BAR