jika-diubah-sejak vs jika-tidak ada-cocok

89

Apa yang bisa menjadi perbedaan antara jika-diubah-sejak dan jika-tidak ada-cocok? Saya merasa jika-tidak ada-cocok digunakan untuk file sedangkan jika-diubah-sejak digunakan untuk halaman?

Menara
sumber

Jawaban:

112

Mengenai perbedaan antara Last-Modified/If-Modified-Sincedan ETag/If-None-Match:

Keduanya dapat digunakan secara bergantian. Namun, bergantung pada jenis sumber daya, dan bagaimana sumber daya dibuat di server, satu atau pertanyaan lain ("apakah ini telah diubah sejak ...?" / "Apakah ini masih cocok dengan ETag ini?") Mungkin lebih mudah dijawab .

Contoh:

  • Jika Anda menyajikan file, menggunakan file mtimesebagai Last-Modifiedtanggal adalah solusi paling sederhana.
  • Jika Anda menyajikan halaman web dinamis yang dibangun dari sejumlah kueri SQL, memeriksa apakah data yang dikembalikan oleh salah satu kueri tersebut telah berubah mungkin tidak praktis (kecuali semuanya memiliki semacam kolom "terakhir diubah"). Dalam kasus ini, menggunakan misalnya hash md5 dari konten halaman sebagai ETagakan jauh lebih mudah.
    OTOH, ini berarti Anda masih harus menghasilkan seluruh halaman di server, bahkan untuk GET bersyarat. Mencari tahu apa sebenarnya yang harus dimasukkan ke ETag (kunci utama, nomor revisi, ... dll.) Dapat menghemat banyak waktu di sini.

Lihat tautan berikut untuk detail lebih lanjut tentang topik:

trendel
sumber
Saya telah mengirim ETag ke browser, tetapi tidak pernah meminta halaman yang sama dengan If-None-Match. Apa masalahnya?
Pacerier
2
@pacerier: Browser tidak perlu menggunakan Etag. Jadi ini bisa menjadi browser lama dan mengabaikannya begitu saja. Kemungkinan lainnya adalah bahwa entitas sedang diakses dengan parameter url yang berubah dari panggilan ke panggilan. Jika nama entitas berubah maka etag tidak akan digunakan untuk permintaan yang berbeda.
Rafael Baptista
@RafaelBaptista Untuk menjelaskan lebih lanjut tentang paruh kedua komentar Anda, katakan saya mengalami situasi ini: Saya memiliki server file dan server mendukung pembuatan versi menggunakan ETag dan untuk alasan kompatibilitas mundur, kami biasanya meminta klien menggunakan parameter kueri my_current_version = (versi ). Jika saya mengirim permintaan HTTP dengan nilai yang bervariasi untuk my_current_version, tetapi juga dengan ETag, lalu kriteria apa, sebagai praktik terbaik, yang akan diprioritaskan saat menentukan apakah akan menyajikan versi baru atau mengirim kembali 304? Terima kasih!
laughing_man
1
Bagaimana server menggunakan Etag tergantung pada server. Anda mungkin dapat mengonfigurasi sebagian besar server file untuk mengabaikan parameter dengan etag jika Anda ingin melalui aturan penulisan ulang. Anda memiliki sedikit kendali atas klien - browser. Sebagian besar tidak akan mengirim header etag yang mereka dapatkan untuk satu set parameter dalam permintaan untuk yang lain. Permintaan klien untuk gambar? V = 1 tidak akan mengirimkan etag yang sama untuk gambar? V = 2. Jika saya menulis server saya sendiri, saya akan menerapkan etag sebagai hash dari konten gambar. Setiap url yang meminta sumber daya, dan dilengkapi dengan etag yang cocok dengan hash gambar yang akan saya kirim, saya mengembalikan 304.
Rafael Baptista
22

If-Modified-Sincedibandingkan dengan Last-Modifiedsedangkan If-None-Matchdibandingkan dengan ETag. Keduanya Modified-Sincedan ETagdapat digunakan untuk mengidentifikasi varian spesifik dari sebuah resource.

Tetapi perbandingan If-Modified-Sinceuntuk Last-Modifiedmemberi Anda informasi apakah varian yang di-cache lebih lama atau lebih baru sedangkan perbandingan If-None-Matchuntuk ETaghanya memberi Anda informasi apakah keduanya identik atau tidak. Selain itu, sebagian besar ETaggenerator menyertakan informasi dari inode khusus sistem sehingga memindahkan file ke drive yang berbeda juga dapat mengubah ETag.

Gumbo
sumber
Menarik, tetapi mengapa saya menggunakan pemeriksaan "identik" di atas pemeriksaan "terakhir diubah"? Apa manfaatnya? Jika Anda memiliki file untuk ditayangkan, mana yang merupakan pilihan yang lebih baik?
Menara
7
Dengan komputer, waktu menjadi rapuh. Detik kabisat, beralih antara waktu penghematan siang hari, dan jam yang tidak akurat, semuanya dapat menyebabkan pemeriksaan "terakhir diubah" untuk mengembalikan hasil yang salah. Membandingkan konten itu sendiri (atau hash MD5 konten) menghindari masalah tersebut.
devdanke
Meskipun begitu, saya sangat memahami @devdanke, saya akan mengatakan bahwa memeriksa stempel waktu jauh lebih cepat daripada memeriksa md5sum. Tujuan dari header ini adalah untuk membuatnya cepat, terkadang lebih disukai untuk tidak mentransfer versi baru dari suatu entitas ke klien daripada memuat server dengan I / O. Bagaimanapun, pengguna selalu dapat menekan ctrl + shift + R (atau ctrl + F5 atau apa pun)
Duka
13

Nilai stempel waktu yang digunakan dalam Last-Modified / If-Modified-Because memiliki ketepatan yang terbatas - satu detik dan itu tidak cukup untuk mengubah konten dengan cepat seperti, misalnya, aplikasi obrolan web di mana lebih dari satu pesan dapat diposting pada detik tertentu . ETag / If-None-Match dapat membantu memecahkan masalah itu.

Alex K
sumber
9

Seperti yang dinyatakan dalam praktik terbaik Google:

Penting untuk menentukan salah satu dari Expires atau Cache-Control max-age, dan salah satu dari Last-Modified atau ETag, untuk semua sumber daya yang dapat disimpan dalam cache. Menentukan Expires dan Cache-Control: max-age, atau menentukan Last-Modified dan ETag adalah hal yang berlebihan.

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

Dionysios Arvanitis
sumber
URL tersebut tidak lagi memiliki teks yang mirip dengan itu. Tidak ada batasan penggunaan Last-Modifieddengan ETag(atau, di sisi agen pengguna, If-Modified-Sincedengan If-None-Match) disebutkan. Demikian pula spesifikasi W3 tidak membatasi Anda. Dikatakan untuk tidak digunakan If-Modified-Sincedengan If-Match, tetapi saya berasumsi itu karena kumpulan dokumen yang memiliki tanggal diperbarui tetapi konten yang sama seperti yang ditentukan oleh ETag harus cukup kecil.
mpag
3

Kecuali dinyatakan lemah oleh server, ETag dianggap sebagai validator yang kuat, dan karenanya dapat digunakan untuk memenuhi permintaan rentang bersyarat. Namun, sebagian besar ETag yang dibuat secara otomatis menunjukkan kesulitan dalam situasi server farm, karena mereka sering menggunakan informasi inode dan / atau penghitung persisten unik. Dalam praktiknya, saya telah menemukan tajuk Last Modified cukup untuk konten yang cukup statis, misalnya menyajikan konten statis yang dilindungi, karena waktu penulisan file menjadi validator yang cukup baik.

ETag sejauh ini adalah yang paling fleksibel. Klien yang sesuai diharuskan untuk mengirim ETag dalam permintaan bersyarat, sedangkan mereka HARUS mengirim keduanya jika tersedia.

Thomas S. Trias
sumber
0

Header Jika-Dimodifikasi-Sejak digunakan untuk menentukan waktu saat browser terakhir menerima sumber daya yang diminta. Header If-None-Match digunakan untuk menentukan tag entitas yang dikeluarkan server dengan sumber daya yang diminta saat terakhir kali diterima.

Dalam dua cara yang dijelaskan, header ini digunakan untuk mendukung caching konten dalam browser, dan mereka memungkinkan server untuk menginstruksikan browser untuk menggunakan salinan sumber daya yang di-cache, daripada merespons dengan konten penuh dari sumber daya jika ini adalah tidak perlu.

Serhan M.
sumber