ETag vs Header Berakhir

359

Saya sudah melihat-lihat tetapi belum bisa mencari tahu apakah saya harus menggunakan keduanya ETag dan sebuah Berakhir header atau satu atau yang lain.

Apa yang saya coba lakukan adalah memastikan bahwa file flash saya (dan gambar lain dan apa yang tidak hanya diperbarui ketika ada perubahan pada file-file itu.

Saya tidak ingin melakukan sesuatu yang istimewa seperti mengganti nama file atau meletakkan beberapa karakter aneh di akhir url agar tidak di-cache.

Juga, adakah yang perlu saya lakukan secara programatik pada skrip PHP saya untuk mendukung ini atau itu semua Apache?

GeoffreyF67
sumber
1
developer.mozilla.org/en-US/docs/Web/HTTP/Caching (baik secara umum)
Christophe Roussy

Jawaban:

677

Mereka sedikit berbeda - ETag tidak memiliki informasi apa pun yang dapat digunakan klien untuk menentukan apakah akan membuat permintaan untuk file itu lagi di masa mendatang. Jika hanya ETag yang dimilikinya, ia harus selalu membuat permintaan. Namun, ketika server membaca ETag dari permintaan klien, server kemudian dapat menentukan apakah akan mengirim file (HTTP 200) atau memberi tahu klien untuk hanya menggunakan salinan lokal mereka (HTTP 304). ETag pada dasarnya hanya sebuah checksum untuk file yang berubah secara semantik ketika konten file berubah.

Header Kedaluwarsa digunakan oleh klien (dan proksi / cache) untuk menentukan apakah perlu atau tidak membuat permintaan ke server sama sekali. Semakin dekat Anda dengan tanggal Kedaluwarsa, semakin besar kemungkinan klien (atau proxy) akan membuat permintaan HTTP untuk file itu dari server.

Jadi sebenarnya yang ingin Anda lakukan adalah menggunakan KEDUA header - atur header Expires ke nilai yang masuk akal berdasarkan seberapa sering konten berubah. Kemudian konfigurasikan ETag yang akan dikirim sehingga ketika klien DO mengirim permintaan ke server, ia dapat lebih mudah menentukan apakah akan mengirim file kembali atau tidak.

Satu catatan terakhir tentang ETag - jika Anda menggunakan pengaturan server yang seimbang dengan beberapa mesin yang menjalankan Apache Anda mungkin ingin mematikan generasi ETag. Ini karena inode digunakan sebagai bagian dari algoritma hash ETag yang akan berbeda antara server. Anda dapat mengonfigurasi Apache untuk tidak menggunakan inode sebagai bagian dari perhitungan, tetapi kemudian Anda ingin memastikan cap waktu pada file persis sama, untuk memastikan ETag yang sama dihasilkan untuk semua server.

Marc Novakowski
sumber
12
Anda juga harus memeriksa apakah Anda harus menggunakan Kontrol-Cache alih-alih Kedaluwarsa. Pemahaman saya adalah bahwa Kontrol-Cache diperkenalkan setelah Kedaluwarsa dan memberi Anda lebih banyak kontrol. Lihat stackoverflow.com/questions/5799906/…
Luis Perez
6
Saat menggunakan tajuk Kedaluwarsa, praktik yang baik untuk mengubah nama file setiap kali sumber daya berubah, karena klien tidak akan meminta file lagi sebelum basi. Terutama jika Anda menggunakan nilai jauh di masa depan sebagai tanggal kedaluwarsa.
schnatterer
8
Katakanlah kita akan menggunakan keduanya. Apa yang terjadi ketika waktu Kedaluwarsa telah kedaluwarsa, tetapi file tidak diubah (Etagnya sama)? Server akan mengembalikan 304 dan file akan disajikan dari cache browser. Pertanyaan saya adalah, akankah regenerasi waktu Kedaluwarsa saat ini?
user345602
2
Hati-hati mengatur ETAG dan header Kedaluwarsa ke nilai yang tidak nol. Ini dapat menyebabkan kondisi balapan. Lihat jakearchibald.com/2016/caching-best-practices
Weston
2
Apakah mungkin memberi tahu server untuk tidak menggunakan inode atau cap waktu sama sekali? Juga, mengapa mereka diperlukan untuk ETag, jika digunakan untuk mewakili konten saja?
Cesar Castro
108

Header Etag dan Last-modified adalah validator .

Mereka membantu browser dan / atau cache (reverse proxy) untuk memahami apakah suatu file / halaman, telah berubah, bahkan jika itu mempertahankan nama yang sama.

Kedaluwarsa dan Kontrol-cache memberikan informasi penyegaran .

Ini berarti bahwa mereka menginformasikan, browser dan membalikkan di antara proxy, sampai berapa lama atau berapa lama, mereka dapat menyimpan halaman / file di cache mereka.

Jadi pertanyaannya biasanya adalah yang validator mana yang harus digunakan, etag atau terakhir dimodifikasi, dan yang menyegarkan header informasi untuk menggunakan, kedaluwarsa atau kontrol cache.

john
sumber
31

Expiresdan Cache-Control"header caching yang kuat"

Last-Modifieddan ETag"header caching lemah"

Pertama-tama browser memeriksa Expires/Cache-Controluntuk menentukan apakah akan membuat permintaan ke server atau tidak

Jika harus membuat permintaan, itu akan mengirimkan Last-Modified/ETagpermintaan HTTP. Jika Etagnilai dokumen cocok dengan itu, server akan mengirim kode 304 bukan 200, dan tidak ada konten. Browser akan memuat konten dari cache-nya.

hienbt88
sumber
1
apakah Anda menemukan dokumen yang mendukung perilaku caching "kuat dan lemah"? Saya tidak dapat menemukan satu, dan browser klien saya sekarang memprioritaskan modifikasi terakhir berakhir, yang saya tidak mengerti mengapa.
GMsoF
1
@GMsoF Anda mungkin ingin melihat ini: tools.ietf.org/html/rfc7232#section-2.1
Medeiros
Jadi, jika saya ingin memastikan bahwa perubahan saya segera disebarkan ke klien, tetapi masih bermanfaat untuk beberapa caching, saya hanya dapat menggunakan Last-Modified dan ETag, bukan?
Sebastien Lorber
Ini adalah jawaban yang paling singkat dan jelas bagi saya! Terima kasih.
aderchox
18

Secara default, Apache akan menghasilkan Etag berdasarkan nomor inode file, tanggal modifikasi terakhir, dan ukuran, yang seharusnya baik-baik saja untuk melakukan apa yang Anda inginkan. Saya pikir itu juga akan menghasilkan secara default header dimodifikasi terakhir berdasarkan waktu modifikasi terakhir dari file pada disk, yang juga sangat baik untuk melakukan apa yang Anda inginkan.

Anda mungkin juga harus meminta Apache mengirim tajuk Kedaluwarsa bertanggal satu tahun di masa mendatang (menurut http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21 ) sehingga browser tahu kontennya adalah dapat disimpan dalam cache Lihatlah mod_expires untuk mengonfigurasinya.

David Z
sumber
Jadi ETag akan memiliki yang terakhir dimodifikasi dan header yang kedaluwarsa akan memberitahu saya ingin menyimpannya dan ketika saya mengunggah dan menimpa file saya itu hanya akan ditarik ke cache pengguna lagi jika tidak 304 akan dihasilkan kan?
GeoffreyF67
Etag tergantung dengan cara yang rumit pada tanggal modifikasi terakhir; tetapi ketika Anda memodifikasi file, Etag akan berubah. Kemudian Etag yang dikirim oleh browser (untuk versi file yang di-cache) tidak akan cocok dengan Etag file di server, dan Apache akan mengirim file daripada respons 304.
David Z
6
Bukankah tajuk satu tahun kedaluwarsa memberi tahu klien untuk tidak memeriksa versi baru selama satu tahun?
John Bachir
@ John: yeah, saya kira saya sedang memikirkan konten statis yang tidak pernah berubah ketika saya menulis itu.
David Z
2
@ John Bachir: itu harus menjadi expecetd beahviour, tetapi browser tampaknya memukul server setidaknya untuk penyelidikan untuk versi yang lebih baru. Saya membuka pertanyaan lain tentang masalah ini: stackoverflow.com/questions/10048740/…
Marco Demaio
13

Ringkasan lain:

Anda harus menggunakan keduanya. ETag adalah informasi "sisi server". Kedaluwarsa adalah caching "Sisi klien".

  • Gunakan ETag kecuali jika Anda memiliki server beban-seimbang. Mereka aman dan akan memberi tahu klien bahwa mereka harus mendapatkan versi baru dari file server Anda setiap kali Anda mengubah sesuatu di sisi Anda.

  • Kedaluwarsa harus digunakan dengan hati-hati, seolah-olah Anda menetapkan tanggal kedaluwarsa jauh di masa depan tetapi ingin mengubah salah satu file dengan segera (misalnya file JS), beberapa pengguna mungkin tidak mendapatkan versi modifikasi sampai waktu yang lama!

Benjamin Piette
sumber
2
Dalam hal situasi Kedaluwarsa ini pada dasarnya Anda perlu mengganti nama js Anda dan mengubahnya dalam HTML Anda, dan harap Anda tidak menyetel file HTML berakhir 1 tahun juga.
EralpB
1

Satu hal tambahan yang ingin saya sebutkan bahwa beberapa jawaban mungkin terlewatkan adalah kerugian memiliki keduanya ETagsdan Expires/Cache-controldi header Anda.

Tergantung pada kebutuhan Anda, itu mungkin hanya menambahkan byte tambahan di header Anda yang dapat meningkatkan paket yang berarti lebih banyak TCP overhead. Sekali lagi, Anda harus melihat apakah overhead memiliki kedua hal di header Anda diperlukan atau hanya menambah berat dalam permintaan Anda yang mengurangi kinerja.

Anda dapat membaca lebih lanjut tentang hal ini di posting blog yang luar biasa ini oleh Kyle Simpson: http://calendar.perfplanet.com/2010/bloated-request-response-headers/

aneagoie
sumber
1

Dalam pandangan saya, Dengan Expire Header, server dapat memberi tahu klien kapan data saya akan basi, sementara dengan Etag, server akan memeriksa nilai etag untuk setiap permintaan klien.

Cerah
sumber
0

ETag digunakan untuk menentukan apakah suatu sumber daya harus menggunakan salinan itu. dan Expire Header seperti Cache-Control memberi tahu klien bahwa sebelum dekade cache, klien harus mengambil sumber daya lokal.

Di situs modern, Ada sering menawarkan file bernama hash, suka app.98a3cf23.js , sehingga merupakan praktik yang baik untuk menggunakan Expires Header. Selain itu, ini juga mengurangi biaya jaringan.

Semoga ini membantu;)

Jack Chen
sumber