“304 Değiştirilmedi” tam olarak nasıl çalışır?


175
  • "304 Değiştirilmedi" yanıtı nasıl üretilir?

  • Bir tarayıcı bir HTTP isteğine verilen yanıtın 304 olup olmadığını nasıl belirler?

  • Tarayıcı tarafından mı ayarlandı yoksa sunucudan mı gönderildi?

  • Sunucu tarafından gönderilirse, sunucu önbellekteki kullanılabilir verileri nasıl bilir, ayrıca 304'ü bir görüntüye nasıl ayarlar?

Tahminimce tarayıcı tarafından oluşturulmuşsa:

function is_modified()
{
    return get_data_from_cache() === get_data_from_url();
}

function get_data_from_cache()
{
    return some_hash_or_xxx_function(cache_data);
}

function get_data_from_url()
{
     return some_hash_or_xxx_function(new_data);
}

function some_hash_or_xxx_function(data)
{
     // Do something with the data.
     // What is that algorithm?
     return result;
}

console.log(is_modified());

Veri almak, ayrıştırmak ve veritabanına aktarmak için bir üçüncü taraf API sağlayıcısına güveniyorum. Her istek sırasında veriler değişebilir veya değişmeyebilir, ancak başlık her zaman gönderir 200. Doğrusu ben DB geçen Benzersiz kimliği kontrol ve benzeri ... verilerdeki değişimi belirlemek için, ne de doğrudan sonucu karşılaştırmak, ayrıştırmak istemiyorum md5(), sha1()ve crc32()sonuç karma ve cezası çalışır, ancak bunu merak ediyorum belirlemek için algoritma 304.

Verilerimdeki değişikliği belirlemek için aynı tür algoritmayı kullanmak istiyorum.


2
Evet 304 değiştirilmemiş nasıl çalışır için googled , ama cevap alamadım.
VenomVendor

1
Biraz daha genel olmalısın. google.com/search?q=http%20caching
SLaks

Yanıtlar:


201

Tarayıcı önbelleğine bir şey koyduğunda , sunucudaki Last-Modifiedveya ETagüstbilgisini de saklar .

Tarayıcı daha sonra If-Modified-Sinceveya If-None-Matchüstbilgisiyle bir istek gönderir ve içerik hala o tarihe veya ETag'a sahipse sunucuya 304 göndermesini söyler.

Sunucunun, her kaynağın her sürümü için tarih değiştirilmiş veya ETag değerini hesaplamak için bir yola ihtiyacı vardır; bu genellikle dosya sisteminden veya ayrı bir veritabanı sütunundan gelir.


1
ETagbaşlıkları ile kontrol edilen anahtar kelime ETagher ikisinde de aynı kalır Response Headers& Response Headers From Cache, arkasındaki algoritmayı söyleyebilir misiniz ETag? Sorumluluğumu belirten sorumu güncelledim.
VenomVendor

4
@VenomVendor: ETagsadece sunucunun benzersiz bir kimlik (tipik olarak karma veya sürüm numarası veya vektör saati) depolayabildiği bir alandır. Bu kimliği hesaplamanıza yardımcı olmaz; bu sunucu tarafı kodunuza bağlıdır.
SLaks

@SLaks: Sayfada bir db çağrısı varsa ne olur ... db'deki verilerin değişmesi ihtimali var ... Bu durumda son değiştirilen çağrıyı kontrol etmek mantıklı değil mi? Bu durum nasıl ele alınır?
user1050619

3
@ user1050619: ETag'ın doğru olduğundan emin olmak sunucunuza bağlıdır. Bir DB'den veri gösterirseniz, bunu eklemeniz gerekir.
SLaks

Hala belirsiz olan bir max-ageşey, tarayıcınızın büyük bir istekte bulunup bulunmaması gerekip gerekmediğidir ? (304'te saplama ve istekte bulunmadığı gibi) ... bunu örneğin "parmak izi" varlıklarıyla (sonsuza kadar iyi) istersiniz. Başka ne anlamı var max-age...
Andy Hayden

19

Son Değiştirme Tarihi: İstenen nesne için son değiştirme tarihi

If-Modified-Since: Son değiştirilme tarihi değiştirilmezse 304 Değiştirilmedi modunun döndürülmesine izin verir.

ETag: ETag, bir web sunucusu tarafından URL'de bulunan bir kaynağın belirli bir sürümüne atanan opak bir tanımlayıcıdır. Bu URL'deki kaynak gösterimi değişirse, yeni ve farklı bir ETag atanır.

If-None-Match: ETag değişmezse 304 Değiştirilmedi değerini döndürür.

URL'yi tekrar istemeniz gerektiğinde, tarayıcı tarihi (Son Değiştirme Tarihi) veya kimliğe (ETag) sahip önbellek, tarayıcı başlık ile istek mesajı gönderir:

resim açıklamasını buraya girin

if ifadesi False olduğunda sunucu 304 değerini döndürür ve tarayıcı önbellek kullanır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.