HTTP durum kodu 200 (önbellek) ile durum kodu 304 arasındaki fark nedir?


201

Web siteme erişmek için Firefox için Google "Sayfa Hızı" eklentisini kullanıyorum.

Sayfamdaki bazı bileşenler HTTP durumu olarak belirtildi:

200200 (önbellek) 304

Google'ın "Sayfa Hızı" ile.

Kafan karıştığım şey 200 (önbellek) ve 304 arasındaki fark.

Sayfayı birkaç kez yeniledim (ancak önbelleğimi temizlemedim) ve diğer bazı resimler http durumu 304 iken her zaman benim favicon.ico ve birkaç resim status = 200 (önbellek) gibi görünüyor.

Aradaki farkın neden olduğunu anlamıyorum.

GÜNCELLEME :

Google "Sayfa Hızı" kullanarak, http://example.com/favicon.ico ve "200 (önbellek)" http://cdn.example.com/js/ga.js

Ancak, http durumu "304" http://cdn.example.com/js/combined.min.js

Neden aynı dizin / js /, bir http durumu 304 döndüren ve diğer 200 (önbellek) durum kodu döndüren iki JavaScript dosyaları var anlamıyorum.

Yanıtlar:


220

"200 (önbellek)" koduna sahip öğeler doğrudan tarayıcı önbelleğinizden yerine getirilir; bu, öğelere ilişkin orijinal isteklerin, tarayıcının bunları önbelleğe alabileceğini gösteren başlıklarla (ör. Gelecekteki tarihli ExpiresveyaCache-Control: max-age üstbilgiler) ve yeni isteği tetiklediğinizde, bu önbelleğe alınmış nesneler yine de yerel önbellekte depolanmış ve süresi henüz dolmamıştı.

Diğer taraftan 304'ler, tarayıcının önbelleğe aldığı son sürümden beri bir dosyanın değiştirilip değiştirilmediğini kontrol ettikten sonra sunucunun yanıtıdır (yanıt "hayır" dır).

En uygun web performansı için, en iyi şekilde tüm varlıklar için uzak bir gelecek Expires:veya Cache-Control: max-ageüstbilgi belirlemeniz ve ardından bir varlığın değiştirilmesi gerektiğinde, varlığın gerçek dosya adını değiştirmeniz veya varlığın isteklerine bir sürüm dizesi eklemeniz gerekir. Bu, varlık önbellekteki sürümden kesinlikle değişmedikçe herhangi bir istekte bulunma ihtiyacını ortadan kaldırır (bu 304 yanıta gerek yoktur). Google, uzun süreli önbelleğin doğru kullanımı hakkında daha fazla ayrıntıya sahiptir .


2
Peki, hız açısından bakıldığında daha iyi ne olabilir ... "200 (önbellek)" veya "304" http durum mesajları?
Hank

22
200 önbellek. Bununla ilgili bazı iyi notlar: developer.yahoo.com/performance/rules.html#expires . Varlıklarınız üzerinde olabildiğince uzun bir sona erme süresi istiyorsunuz, ancak bunu bu şekilde belirli bir miktarda kontrolü kaybettiğinizle dengelemek zorundasınız. Yapabileceğiniz bir şey, dosyalarda uzun süreli sona erme süreleri ayarlamak ve daha sonra gerektiğinde bu dosyalar için bir varlık sürüm numarasını arttırmaktır. Örneğin, değişiklik olduğunda style.css? V1 'i ve <link> öğesinde style.css? V2' ye artış ekleyebilirsiniz.
Ben Regenspan

1
Adalet, bu yüzden neden Firebug ga.js için yerel önbellekten (status = 200 önbellek) çekilirken, combined.min.js 304 http durumunu bildiriyor. Garip olan, her iki dosyanın da aynı dosya türünde (JavaScript) olması ve aynı sunucu dizininde bulunmasıdır. Her ikisinin de 200 veya 304 olacağını ve farklı olmadığını düşünürdünüz
Hank

8
Ve max-ageve ageüstbilgileri de ageküçükse 200 (önbellek) sonuçlarıyla sonuçlanabilir max-age. Bunun tek istisnası, kullanıcının tarayıcı yenileme düğmesini tıklamasıdır, bu durumda 304 üstbilgisi gönderilir.
yitwail

2
HTML5 Demirbaş önbellek bozma sorgu dizesi yöntemi kullanılarak karşı önerir - bu değişiklik iyidir href, url,ve srcher dosya için başvurular sunucu söylemek ardından 'parmak izi' (her iki dosyanın karma veya basit bir artırılır numarası gibi değil), ve o parmak izini çıkarmak ve sadece style.cssya da her neyse. Bunu sunucuda yapamıyorsanız, oluşturma sisteminizin gerçek dosyaları parmak iziyle yeniden adlandırmasını sağlayın.
iono

62

200 (önbellek), Firefox'un yerel olarak önbelleğe alınmış sürümü kullandığı anlamına gelir. Web sunucusuna herhangi bir istekte bulunulmadığından bu en hızlısıdır.

304, Firefox'un Web sunucusuna bir "If-Modified-Since" koşullu isteği gönderdiğini gösterir. Dosya tarayıcı tarafından gönderilen tarihten beri güncellenmediyse, Web sunucusu, Firefox'a önbelleğe alınmış sürümünü kullanmasını söyleyen 304 yanıt döndürür. İstek Web sunucusuna hala gönderildiği için 200 (önbellek) kadar hızlı değil, ancak sunucu dosyanın içeriğini göndermek zorunda değil.

Son sorunuzda, aynı dizindeki iki JavaScript dosyasının neden farklı sonuçlar verdiğini bilmiyorum.


18

Bu beni uzun süre attı. Doğrulayacağım ilk şey, her zaman kaynaklar için koşullu bir istek gönderecek ve sayfa öğelerinin çoğu için 304'ler döndürecek olan yenile düğmesini tıklayarak sayfayı yeniden yüklemediğinizdir. Bunun yerine URL çubuğuna gidin, sayfayı seçin ve aynı URL'yi tekrar yazmış gibi enter'a basın, bu size neyin düzgün önbelleğe alındığının daha iyi bir göstergesini verecektir. Bu makale, koşullu ve koşulsuz istekler arasındaki farkı ve yenileme düğmesinin onları nasıl etkilediğini açıklayan harika bir iş çıkarıyor: http://blogs.msdn.com/b/ieinternals/archive/2010/07/08/technical-information-about- koşullu-http-istekleri-ve-yenileme-button.aspx


1
CDN'ye yapılan 304 istek durumunu anlamaya çalışırken ne kadar zaman harcadığımı bile anlatamam Biraz farklı bir soruya cevap
verseniz de

Haklısınız: Kodlardaki fark, aynı sayfayı yeniden yükleyip yüklememenizle ilgilidir. Bir sayfayı yeniden yüklersem, tarayıcının ağ monitöründe 304 kodunu görürüm. Ancak, aynı dosyaları kullanan başka bir URL'ye erişirsem, tarayıcının ağ monitöründe 200 (önbellekten) kod görüyorum. Benim durumumda, diğer URL yalnızca orijinal URL'ye eklenen bir sorgu dizesiydi (sayfa aslında aynı).
aldemarcalazans

8

HTTP 304 "değiştirilmedi". Web sunucunuz temel olarak tarayıcıya "bu dosya son talep ettiğinizden bu yana değişmedi" diyor. Bir HTTP 200, tarayıcıya "burada başarılı bir yanıt" olduğunu söylerken - tarayıcınızın dosyaya ilk kez eriştiği veya değiştirilmiş bir kopyaya ilk kez erişildiği zaman döndürülmelidir.

Durum kodları hakkında daha fazla bilgi için http://en.wikipedia.org/wiki/List_of_HTTP_status_codes adresine bakın .


Bu da benim anlayışım ... Bu yüzden orijinal yazımda sayfamı birkaç kez yenilediğimi ve hala aynı favicon.ico için "200 (önbellek)" alıyorum ve belirli JavaScript içeriğimi belirtmiştim. Çok garip
Hank

2
200 aslında önbellek demek değildir, sadece OK demektir. Muhtemelen sunucu yapılandırmanız tarayıcıya ico ve js dosyalarınızı önbelleğe almasını açıkça söylemez, bu da 200 durum kodunu döndürür.
richleland

Bazı JavaScript b / c durum böyle değil, 304 ve diğer JavaScript "200 (önbellek)" olsun. Tüm JavaScript aynı web sunucusu dizininde bulunur example.com/js/
Hank

200 (önbellek) sadece yerel olarak önbelleğe alınmış ve aslında sunucuya bir istekte bulunmadığı anlamına gelir, bu da sunucuya gidip 304 yanıt almaktan daha hızlı olacaktır.
richleland

Orijinal yayınımı canlı sitemi ve söz konusu JavaScript'i gösterecek şekilde güncelledim. Lütfen güncellenmiş orijinal gönderime bakın.
Hank

2

Son sorunuz için neden? Bildiklerimle açıklamaya çalışacağım

Layman'ın terimleriyle bu üç durum kodunun kısa bir açıklaması.

  • 200 - başarılı (tarayıcı istekleri ve sunucudan dosya alma)

Sunucuda önbellekleme etkinse

  • 200 (bellek önbelleğinden) - tarayıcıda dosya bulundu, bu yüzden tarayıcı sunucudan istek almıyor
  • 304 - tarayıcı bir dosya istedi, ancak sunucu tarafından reddedildi

Bazı dosyalar için tarayıcı sunucudan istemeye karar verirken, bazıları için saklanan (önbelleğe alınmış) dosyalardan okumaya karar verir. Bu neden ? Her dosyanın bir son kullanma tarihi vardır, bu nedenle

Bir dosyanın süresi dolmazsa, tarayıcı önbellekten (200 önbellek) kullanılır.

Dosyanın süresi dolarsa, tarayıcı sunucudan bir dosya ister. Her iki yerde de sunucu kontrol dosyası (tarayıcı ve sunucu). Aynı dosya bulunursa, sunucu isteği reddeder. Protokol başına tarayıcı mevcut dosyayı kullanır.

bu nginx yapılandırmasına bakın

location / {
    add_header Cache-Control must-revalidate;
    expires     60;
    etag on;

    ...
}

Burada süre sonu 60 saniyeye ayarlanmıştır, bu nedenle tüm statik dosyalar 60 saniye boyunca önbelleğe alınır. Yani 60 saniye içinde tekrar bir dosya talep ederseniz tarayıcı bellekten (200 bellek) okuyacaktır. 60 saniye sonra u talep ederseniz tarayıcı sunucu (304) isteyecektir.

Ben dosya 60 saniye sonra değişmedi varsayalım, bu durumda 200 alacaksınız (yani, güncellenmiş dosya sunucudan getirilir).

Dolayısıyla, sunucular farklı zaman aşımı ve önbellek üstbilgileri (ilkeleri) ile yapılandırılmışsa, durum farklı olabilir.

CDn kullanmanız durumunda, cdn'nin temel amacı yüksek kullanılabilirlik ve hızlı teslimattır. Bu nedenle birden çok sunucu kullanırlar. Dosyalar aynı dizinde gibi görünse de, bu sunucular farklı yapılandırmalara sahipse, cdn u içeriği sağlamak için birden fazla sunucu kullanabilir. Sonra bu durum değişebilir. Umarım yardımcı olur.


304 - Değiştirilmedi, sunucu tarafından "red" değildir. İstemciye "istediğiniz sürüm için, değiştirilmediğini biliyorum, dosyaya gerçekten ihtiyacınız yok" diye bildiren sunucudur. Teknik olarak 304, "yönlendirme" yanıt kodlarından biridir. Bu müşteriye "kendi önbelleğinden al" diyor.
21:19
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.