if-modifiye-beri-if-none-match


90

İf-modifiye-since ve eğer-none-match arasındaki fark ne olabilir? İf-none-match dosyalar için kullanılırken, if-modifiye-since sayfalar için kullanılır.

Yanıtlar:


113

Arasındaki farklılıklar ile ilgili olarak Last-Modified/If-Modified-Sinceve ETag/If-None-Match:

Her ikisi de birbirinin yerine kullanılabilir. Ancak, kaynağın türüne ve sunucuda nasıl oluşturulduğuna bağlı olarak, bir veya diğer soru ("... tarihinden beri değiştirildi mi?" / "Bu hala bu ETag ile eşleşiyor mu?") Yanıtlanması daha kolay olabilir .

Örnekler:

  • Sunum dosyalarını ediyorsanız, dosyasını kullanarak var mtimeolduğu Last-Modifiedtarih en basit çözümdür.
  • Bir dizi SQL sorgusundan oluşturulmuş dinamik bir web sayfası sunuyorsanız, bu sorgulardan herhangi biri tarafından döndürülen verilerin değişip değişmediğini kontrol etmek pratik olmayabilir (hepsinde bir çeşit "son değiştirilmiş" sütun yoksa). Bu durumda, örneğin sayfa içeriğinin md5 karma değerini kullanmak ETagçok daha kolay olacaktır.
    OTOH, bu, koşullu bir GET için bile, tüm sayfayı sunucuda hala oluşturmanız gerektiği anlamına gelir. ETag'a tam olarak neyin girmesi gerektiğini bulmak (birincil anahtarlar, revizyon numaraları, ... vb.) Size burada çok zaman kazandırabilir.

Konuyla ilgili daha fazla ayrıntı için şu bağlantılara bakın:


Tarayıcıya bir ETag gönderdim, ancak If-None-Match ile aynı sayfayı asla istemiyor. Sorun ne olabilir?
Pacerier

2
@pacerier: Tarayıcıların Etag kullanması gerekmez. Yani eski bir tarayıcı olabilir ve onu görmezden gelebilir. Diğer olasılık, varlığa çağrıdan çağrıya değişen url parametreleriyle erişiliyor olmasıdır. Varlık adı değişirse, farklı istekler için etiket kullanılmayacaktır.
Rafael Baptista

@RafaelBaptista Yorumunuzun ikinci yarısında daha fazla ayrıntıya girmek için, şunu söyleyin: Bir dosya sunucum var ve sunucu, ETag'leri kullanarak sürüm belirlemeyi destekliyor ve geriye dönük uyumluluk nedenleriyle, istemcilerin my_current_version = (version ). My_current_version için değişken değerler içeren ve aynı zamanda ETag'ler içeren bir HTTP isteği gönderirsem, yeni bir sürümün sunulması veya bir 304'ün geri gönderilip gönderilmeyeceğini belirlerken en iyi uygulama olarak hangi kriter önceliklendirilir? Teşekkürler!
laughing_man

1
Sunucunun Etag'ı nasıl kullandığı sunucuya bağlıdır. Yeniden yazma kuralları aracılığıyla isterseniz, muhtemelen çoğu dosya sunucusunu parametreleri etag ile yok sayacak şekilde yapılandırabilirsiniz. İstemci üzerinde daha az kontrole sahipsiniz - tarayıcı. Çoğu, bir parametre seti için aldıkları bir etag başlığını bir başkası için bir istekte göndermez. Görüntü? V = 1 için bir müşteri isteği, görüntü için aynı etagı göndermez? V = 2. Kendi sunucularımı yazıyor olsaydım, etag'i görüntü içeriklerinin karması olarak uygulardım. Bir kaynak isteyen ve göndereceğim görüntünün karmasıyla eşleşen bir etag ile gelen herhangi bir url, 304'ü döndürürüm.
Rafael Baptista

22

If-Modified-Sincekarşılaştırılır Last-Modifiedise If-None-Matchkarşılaştırılır ETag. Her ikisi de Modified-Sinceve ETagbir kaynağın belirli bir varyantını tanımlamak için kullanılabilir.

Ama karşılaştırılması If-Modified-Sinceiçin Last-Modifiedsize önbelleğe varyantı olup olmadığı bilgisini veren yaşlı veya daha yeni karşılaştırılması oysa If-None-Matchiçin ETagsadece ikinizi de olup olmadığını bilgi verir özdeş ya da değil. Dahası, ETagjeneratörlerin çoğu sisteme özgü inode bilgilerini içerir, bu nedenle bir dosyanın farklı bir sürücüye taşınması da onu değiştirebilir ETag.


İlginç ama neden "son değiştirilen" kontroller yerine "aynı" kontrolleri kullanayım? Faydaları nelerdir? Sunulacak bir dosya varsa, hangisi daha iyi bir seçenektir?
Kule

7
Bilgisayarlarda zaman kırılgandır. Artık saniyeler, gün ışığı tasarrufu zamanı ve yanlış saatler arasında geçiş yapmak, "son değiştirilmiş" bir kontrolün yanlış sonucu döndürmesine neden olabilir. İçeriğin kendisini (veya içeriğin MD5 karmasını) karşılaştırmak bu sorunları önler.
devdanke

@Devdanke'yi tam olarak anladığıma rağmen, zaman damgasını kontrol etmenin md5sum'u kontrol etmekten çok daha hızlı olduğunu söyleyebilirim. Bu başlıkların amacı hızlı hale getirmektir, bazen sunucuyu G / Ç ile yüklemek yerine istemciye bir varlığın yeni sürümünü aktarmamak tercih edilir. Her neyse, kullanıcı her zaman ctrl + shift + R (veya ctrl + F5 veya her neyse) tuşlarına basabilir
Keder

13

Last-Modified / If-Modified-Since'de kullanılan zaman damgası değeri sınırlı bir hassasiyete sahiptir - bir saniye ve bu, herhangi bir saniyede birden fazla mesajın gönderilebildiği Web-sohbet uygulaması gibi hızlı değişen içerik için yeterli değildir. . ETag / If-None-Match bu sorunu çözmeye yardımcı olabilir.


10

Google'ın en iyi uygulamalarında belirtildiği gibi:

Önbelleğe alınabilir tüm kaynaklar için Expires veya Cache-Control max-age'den birini ve Last-Modified veya ETag'den birini belirtmek önemlidir. Hem Expires hem de Cache-Control: max-age veya hem Last-Modified hem de ETag belirtmek gereksizdir.

https://developers.google.com/speed/docs/best-practices/caching


bu URL artık buna benzer bir metne sahip değil. Kullanılmasına karşı herhangi bir kısıtlama Last-Modifiedile ETag(kullanıcıaracısı tarafında ya da If-Modified-Sincebirlikte If-None-Match) bahsedilmektedir. Benzer şekilde W3 özelliği sizi kısıtlamaz. Kullanımı değil diyor If-Modified-Sinceile If-Matchancak ETag tarafından tanımlanan tarihleri fakat aynı içeriği güncelledik belgelerin seti oldukça küçük olmalı çünkü o 's varsayalım.
mpag


3

Sunucu tarafından zayıf olarak belirtilmediği sürece, bir ETag güçlü bir doğrulayıcı olarak kabul edilir ve bu nedenle koşullu aralıklı bir isteği yerine getirmek için kullanılabilir. Ancak, otomatik olarak oluşturulan ETag'lerin çoğu, genellikle inode bilgileri ve / veya benzersiz bir kalıcı sayaç kullandıklarından, sunucu çiftliği durumlarında zorluklar sergiler. Pratikte, Last Modified başlığının oldukça statik içerik için yeterli olduğunu gördüm, örneğin, dosyanın yazma süresi oldukça iyi bir doğrulayıcı olduğundan, korumalı statik içeriğin sunulması.

ETag, açık ara en esnek olanıdır. Uygun istemcilerin ETag'ı koşullu bir istekte göndermeleri gerekir, ancak mevcutsa her ikisini de göndermeleri GEREKİR.


0

If-Modified-Since başlığı, tarayıcının istenen kaynağı en son aldığı zamanı belirtmek için kullanılır. If-None-Match başlığı, sunucunun en son alındığında istenen kaynakla verdiği varlık etiketini belirtmek için kullanılır.

Açıklanan iki şekilde, bu başlıklar tarayıcıda içeriğin önbelleğe alınmasını desteklemek için kullanılır ve eğer öyleyse kaynağın tüm içeriğiyle yanıt vermek yerine, sunucunun tarayıcıya bir kaynağın önbelleğe alınmış bir kopyasını kullanma talimatı vermesini sağlar. gerekli değil.

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.