İletişim

304 Not Modified Nedir?

Kısa tanım

304 Not Modified, koşullu bir GET ya da HEAD isteğine verilen ve istemcinin elindeki kopyanın hâlâ geçerli olduğunu bildiren HTTP durum kodudur. İstemci önceki yanıttaki ETag değerini If-None-Match, tarihi If-Modified-Since başlığıyla geri gönderir; içerik değişmemişse sunucu gövdesiz bir 304 döndürür ve istemci önbellekteki kopyayı kullanır.

Diğer adları: ETag, If-None-Match, koşullu istek, conditional request, HTTP 304

Tarayıcının ETag ile koşullu istek gönderdiği, sunucunun gövdesiz 304 döndürdüğü ve önbellekteki kopyanın kullanıldığı akış

Koşullu istek adım adım

304, sunucuyla istemci arasındaki kısa bir pazarlığın sonucudur. İlk istekte sunucu içeriği 200 ile gönderir ve içeriğin o anki sürümünü tanımlayan doğrulayıcıları ekler:

HTTP/1.1 200 OK
ETag: "a3f9c1"
Last-Modified: Tue, 15 Sep 2026 08:12:00 GMT
Cache-Control: no-cache

İstemci aynı adresi tekrar istediğinde bu değerleri geri yollar. Sunucu karşılaştırır; değişiklik yoksa gövde göndermeden yanıt verir:

GET /urunler/ HTTP/1.1
If-None-Match: "a3f9c1"
If-Modified-Since: Tue, 15 Sep 2026 08:12:00 GMT

HTTP/1.1 304 Not Modified
ETag: "a3f9c1"
Cache-Control: no-cache

RFC 9110'a göre 304 yanıtı gövde içeremez ve 200'de gönderilecek olan ETag, Cache-Control, Date, Vary gibi başlıkları taşımak zorundadır; istemci önbellekteki kopyayı bu başlıklarla tazeler. Cache-Control değerinin ne zaman yeniden sorulacağını nasıl belirlediği Cache-Control sayfasında anlatılıyor.

ETag mi, Last-Modified mi?

ETag, içeriğin belirli bir sürümü için sunucunun ürettiği opak bir kimliktir; genellikle içeriğin özeti ya da sürüm numarasıdır. Başında W/ olan zayıf ETag, içeriğin anlamca aynı olduğunu ama bayt bayt aynı olmayabileceğini söyler. Last-Modified ise saniye çözünürlüğünde bir tarihtir: aynı saniyede iki kez değişen içeriği ayırt edemez ve tarih biçimi hatalı yazılırsa istemciler onu okuyamaz.

İkisi birlikte gönderildiğinde öncelik ETag'dedir: RFC 9110, If-None-Match varsa If-Modified-Since'ın hiç değerlendirilmeyeceğini söyler. Google da kendi tarayıcıları için, tarih biçimi sorunları olmadığı gerekçesiyle ETag'i önerir; yine de diğer istemciler ve CMS'ler için ikisini birden göndermenin zararı yoktur.

Googlebot ve 304

Google'ın tarama altyapısı ETag/If-None-Match ve Last-Modified/If-Modified-Since mekanizmalarını destekler; Googlebot bu desteği Google Arama için URL'leri yeniden tararken kullanır, ancak her Google tarayıcısı önbelleği kullanmaz. Google'a göre 304, içeriğin son taramadakiyle aynı olduğunu bildirir; dizine ekleme sistemi URL'nin sinyallerini yeniden hesaplayabilir ama kod dizine eklemeyi başka şekilde etkilemez. Kazanç verimlilikte yatar: değişmemiş sayfalar için gövde aktarılmaz, sunucu yükü azalır ve özellikle büyük sitelerde tarama bütçesi değişen sayfalara kalır.

304'ü hiç üretmeyen yaygın hatalar

  • Her istekte değişen ETag: Sayfaya her yanıtta farklı bir CSRF token'ı, nonce ya da zaman damgası gömülüyse içerik özeti de her seferinde değişir ve 304 asla oluşmaz.
  • Sunucuya özgü ETag: ETag dosyanın inode numarası gibi makineye özgü bir değerden üretiliyorsa, bir yük dengeleyici arkasındaki her sunucu aynı dosya için farklı ETag verir.
  • Sıkıştırma katmanı: Yanıtı sıkıştıran bir ara katman güçlü ETag'i zayıfa (W/) çevirebilir; bu normaldir, ama bazı katmanlar ETag'i tamamen siler.
  • Yanlış 304: İçerik değiştiği halde eski doğrulayıcıyı döndürmek en tehlikelisidir; istemci ve Googlebot eski kopyada kalır.

Doğru çalıştığını görmek için iki adım yeterlidir: curl -sI URL ile ETag değerini alın, ardından curl -sI -H 'If-None-Match: "a3f9c1"' URL ile aynı değeri geri gönderip yanıtın 304 olduğunu doğrulayın.

İlgili terimler

← Sözlüğe dön