ETag ve Üstbilginin Sona Ermesi


359

Etrafa baktım fakat bir ETag hem kullanmalısınız olmadığını anlamaya edemedik ve bir Başlık Expires ya biri ya diğeri.

Yapmaya çalıştığım şey, flash dosyalarımın (ve diğer resimlerimin ve yalnızca bu dosyalarda bir değişiklik olduğunda güncellenmenin değil).

Dosya adını değiştirmek veya URL'nin önbelleğe alınmamasını sağlamak için tuhaf karakterler koymak gibi özel bir şey yapmak istemiyorum.

Ayrıca, bunu desteklemek için PHP scriptlerimde programlı olarak yapmam gereken bir şey var mı yoksa hepsi Apache mi?


Yanıtlar:


677

Biraz farklıdırlar - ETag, istemcinin gelecekte bu dosya için yeniden istekte bulunup bulunmayacağını belirlemek için kullanabileceği herhangi bir bilgiye sahip değildir. ETag sahip olduğu her zaman bir istekte bulunacaktır. Ancak, sunucu ETag'ı istemci isteğinden okuduğunda, sunucu dosyayı (HTTP 200) gönderip göndermeyeceğini veya istemciye yerel kopyalarını (HTTP 304) kullanmasını söyleyebilir. Bir ETag, temel olarak dosyanın içeriği değiştiğinde anlamsal olarak değişen bir dosyanın sağlama toplamıdır.

Expires üstbilgisi, istemci (ve proxy'ler / önbellekler) tarafından sunucuya hiç istekte bulunup bulunmayacağını belirlemek için kullanılır. Sona erme tarihine ne kadar yakın olursanız, istemcinin (veya proxy) sunucudan o dosya için bir HTTP isteği yapma olasılığı o kadar yüksektir.

Gerçekten yapmak istediğiniz şey İKİ başlık kullanmaktır - Expires başlığını içeriğin ne sıklıkta değiştiğine bağlı olarak makul bir değere ayarlayın. Ardından ETag'leri gönderilecek şekilde yapılandırın, böylece istemciler sunucuya bir istek gönderdiğinde, dosyanın geri gönderilip gönderilmeyeceğini daha kolay belirleyebilir.

ETag hakkında son bir not - Apache çalıştıran birden fazla makine ile yük dengeli bir sunucu kurulumu kullanıyorsanız, muhtemelen ETag üretimini kapatmak isteyeceksiniz. Bunun nedeni, inotların sunucular arasında farklı olacak ETag karma algoritmasının bir parçası olarak kullanılmasıdır. Apache'yi hesaplamaların bir parçası olarak inodes kullanmayacak şekilde yapılandırabilirsiniz, ancak daha sonra tüm sunucular için aynı ETag'ın oluşturulduğundan emin olmak için dosyalardaki zaman damgalarının tamamen aynı olduğundan emin olmak istersiniz.


12
Ayrıca, Expires yerine Cache-Control kullanıp kullanmadığınızı da kontrol etmelisiniz. Anladığım kadarıyla Önbellek Kontrolü, Sona Erme tarihinden sonra tanıtıldı ve size daha fazla kontrol sağlıyor. Bkz. Stackoverflow.com/questions/5799906/…
Luis Perez

6
Expires üstbilgisini kullanırken, kaynak her değiştiğinde dosya adını değiştirmek iyi bir uygulamadır, çünkü istemci eski olmadan dosyayı yeniden istemez. Özellikle son kullanma tarihi son kullanma tarihi olarak kullanıyorsanız.
schnatterer

8
Her ikisini de kullanacağımızı varsayalım. Sona Erme süresi dolduğunda ancak dosya değiştirilmediğinde ne olur (Etag aynıdır)? Sunucu 304'e dönecek ve dosya tarayıcı önbelleğinden sunulacaktır. Benim sorum şu anda sona erme zamanı yenilenecek mi?
user345602

2
ETAG ve Expires üstbilgisini sıfır dışında bir değere ayarlamaya dikkat edin . Bu yarış koşullarına yol açabilir. Bkz. Jakearchibald.com/2016/caching-best-practices
Weston

2
Sunuculara inode veya zaman damgası kullanmamasını söylemek mümkün müdür? Ayrıca, yalnızca içeriği temsil etmek için kullanılıyorsa neden ETag'ler için gereklidir?
Cesar Castro

108

Etag ve Son değiştirilen başlıklar doğrulayıcıdır .

Tarayıcının ve / veya önbelleğin (ters proxy) bir dosyanın / sayfanın aynı adı koruyor olsa bile değişip değişmediğini anlamasına yardımcı olurlar.

Son kullanma tarihi ve Önbellek kontrolü yenileme bilgileri veriyor .

Bu, tarayıcıyı ve proxy'ler arasındaki tersi bilgileri, ne zamana veya ne kadar süreyle önbelleğinde tutabilecekleri anlamına gelir.

Yani soru genellikle hangi bir doğrulayıcının kullanılacağı, etag veya son değiştirildiği ve hangi bilgi üstbilgisinin kullanılacağı, süresinin doldurulacağı veya önbellek kontrolünün yenileneceği sorusudur.


31

Expiresve Cache-Control"güçlü önbellek üstbilgileri"

Last-Modifiedve ETag"zayıf önbellek üstbilgileri"

Öncelikle tarayıcı Expires/Cache-Control, sunucuya istekte bulunup bulunmayacağını belirlemek için kontrol eder

Bir istekte Last-Modified/ETagbulunmanız gerekirse, HTTP isteğinde gönderilir. EtagBelgenin değeri eşleşirse, sunucu 200 yerine 304 kodu gönderir ve içerik olmaz. Tarayıcı, içerikleri önbelleğinden yükleyecektir.


1
"güçlü ve zayıf" önbellekleme davranışını destekleyen herhangi bir belge buluyor musunuz? Bir tane bulamadım ve müşteri tarayıcım artık son değiştirilme süresinin dolmasına öncelik veriyor, bu yüzden nedenini anlamıyorum.
GMsoF

1
@GMsoF Şuna bir göz atmak isteyebilirsiniz: tools.ietf.org/html/rfc7232#section-2.1
Medeiros

Yani, değişikliklerimin hemen istemciye yayıldığından emin olmak istiyorsam, ancak yine de bazı önbelleklerden yararlanırsam, sadece Last-Modified ve ETag'i doğru kullanabilir miyim?
Sebastien Lorber

Bu bana en kısa ve en açık cevap! Teşekkürler.
aderchox

18

Varsayılan olarak Apache , dosyanın inode numarasını, son değiştirilme tarihini ve boyutunu temel alarak bir Etag oluşturur ve bu da istediğinizi yapmak için mükemmel şekilde iyi olur. Ayrıca, varsayılan olarak istediğiniz dosyayı yapmak için gayet iyi olan diskteki dosyanın son değişiklik süresine dayalı bir Last-Modified başlığı oluşturacağını düşünüyorum.

Muhtemelen Apache'nin ileride bir yıl sonra bir Expires başlığı göndermesi gerekir ( http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21'e göre ), tarayıcıların içeriğin cacheable. Bunu yapılandırmak için mod_expires'e bir göz atın .


Bu yüzden ETag en son değiştirilmiş olacak ve son kullanma tarihi, önbelleğe almasını istediğimi söyleyecek ve dosyamı yükleyip üzerine yazdığımda kullanıcının önbelleğine tekrar çekilecek, aksi takdirde 304 üretilecek doğru mu?
GeoffreyF67

Etag, karmaşık bir şekilde son değiştirilme tarihine bağlıdır; ancak dosyayı değiştirdiğinizde Etag değişecektir. Daha sonra tarayıcı tarafından gönderilen Etag (dosyanın önbelleğe alınmış sürümü için), sunucudaki dosyanın Etag'iyle eşleşmez ve Apache dosyayı 304 yanıtı yerine gönderir.
David Z

6
Bir yıllık sürenin sona ermesi halinde, başlık müşteriye bir yıl boyunca yeni bir sürüm olup olmadığını kontrol etmeyeceğini söylemez mi?
John Bachir

@John: evet, sanırım bunu yazdığımda hiç değişmeyen statik bir içerik düşünüyordum.
David Z

2
John Bachir: Bu beklenti birazcık, ama tarayıcı zaten en azından daha yeni bir sürümü sorgulamak için sunucu vurmak gibi görünüyor. Bu sorunla ilgili başka bir soru açtım: stackoverflow.com/questions/10048740/…
Marco Demaio

13

Başka bir özet:

Her ikisini de kullanmanız gerekir. ETag'ler "sunucu tarafı" bilgisidir. Son kullanma tarihi "İstemci tarafı" önbelleği.

  • Yük dengeli bir sunucunuz dışında ETag'leri kullanın . Güvenlidirler ve istemcilerin her seferinde yanınızda bir değişiklik yaptığınızda sunucu dosyalarınızın yeni sürümlerini almaları gerektiğini bildirirler.

  • Son kullanma tarihi dikkatli bir şekilde kullanılmalıdır, sanki gelecekte bir son kullanma tarihi belirlediyseniz ancak dosyalardan birini hemen değiştirmek istiyorsanız (örneğin bir JS dosyası), bazı kullanıcılar değiştirilen sürümü uzun zamana kadar alamayabilir!


2
Bu süresinin dolması durumunda, temel olarak js'nizi yeniden adlandırmanız ve HTML'nizde değiştirmeniz gerekir ve umarım HTML dosyasının geçerlilik süresini 1 yıl olarak ayarlamamışsınızdır.
EralpB

1

Ben bazı yanıtlar kaçırmış olabilir söz etmek istiyorum ek bir şey olması hem eksisi ise ETagsve Expires/Cache-controlsenin başlıklarını.

İhtiyaçlarınıza bağlı olarak, başlıklarınıza ekstra bayt ekleyebilir, bu da paketleri artırabilir, bu da daha fazla TCP ek yükü anlamına gelir. Yine, başlıklarınızda her iki şeye sahip olmanın ek yükünün gerekli olup olmadığını veya isteklerinize performansı düşüren ekstra ağırlık ekleyip eklemeyeceğini görmelisiniz.

Kyle Simpson'ın bu mükemmel blog yazısında bu konuda daha fazla bilgi bulabilirsiniz: http://calendar.perfplanet.com/2010/bloated-request-response-headers/


1

Benim görüşüme göre, Expire Header ile, sunucu istemciye verilerimin ne zaman eski olacağını söyleyebilir, Etag ile sunucu ise müşterinin her isteğinin etag değerini kontrol eder.


0

ETag, bir kaynağın kopyayı kullanması gerekip gerekmediğini belirlemek için kullanılır. ve Cache-Control gibi Başlık Sona Erir istemciye önbellek onlarca yıl önce, istemcinin yerel kaynağı getirmesi gerektiği söylenir.

Modern sitelerde, genellikle hasires adında bir dosya vardır app.98a3cf23.js, bu nedenle Expires Header'ı kullanmak iyi bir uygulamadır. Bunun yanı sıra ağın maliyetini de azaltır.

Umarım yardımcı olur ;)

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.