Perbedaan antara no-cache dan harus divalidasi ulang

179

Dari RFC 2616

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1

tanpa cache

Jika direktif no-cache tidak menentukan nama bidang, maka cache TIDAK HARUS menggunakan respons untuk memenuhi permintaan berikutnya tanpa validasi ulang berhasil dengan server asal. Ini memungkinkan server asal untuk mencegah caching bahkan oleh cache yang telah dikonfigurasi untuk mengembalikan respons basi ke permintaan klien.

Jadi itu mengarahkan agen untuk memvalidasi ulang semua tanggapan.

Dibandingkan dengan ini

harus divalidasi ulang

Ketika direktif harus memvalidasi ulang hadir dalam respons yang diterima oleh cache, cache itu TIDAK boleh menggunakan entri setelah menjadi basi untuk menanggapi permintaan berikutnya tanpa terlebih dahulu memvalidasi ulang dengan server asal

Jadi itu mengarahkan agen untuk memvalidasi respons basi .

Khususnya berkaitan dengan no-cache, apakah ini cara agen pengguna sebenarnya, secara empiris memperlakukan arahan ini?

Apa gunanya no-cachejika ada must-revalidatedan max-age?

Lihat komentar ini:

http://palpapers.plynt.com/issues/2008Jul/cache-control-attributes/

tanpa cache

Meskipun arahan ini sepertinya memerintahkan browser untuk tidak men-cache halaman, ada perbedaan yang halus. Arahan “tanpa cache”, menurut RFC, memberi tahu browser bahwa browser harus divalidasi ulang dengan server sebelum melayani halaman dari cache. Validasi ulang adalah teknik rapi yang memungkinkan aplikasi menghemat lebar pita. Jika halaman yang di-cache oleh browser tidak berubah, server hanya memberi sinyal ke browser dan halaman ditampilkan dari cache. Karenanya, browser (setidaknya secara teori), menyimpan halaman dalam cache-nya, tetapi menampilkannya hanya setelah divalidasi ulang dengan server. Dalam praktiknya, IE dan Firefox sudah mulai memperlakukan direktif tanpa-cache seolah-olah itu memerintahkan browser untuk tidak melakukan cache halaman. Kami mulai mengamati perilaku ini sekitar setahun yang lalu.

Adakah yang punya hal yang lebih resmi tentang ini?

Memperbarui

Arahan yang harus divalidasi ulang harus digunakan oleh server jika dan hanya jika kegagalan untuk memvalidasi permintaan pada representasi dapat mengakibatkan operasi yang tidak benar, seperti transaksi keuangan yang tidak dieksekusi secara diam-diam.

Itu adalah sesuatu yang tidak pernah saya ingat sampai sekarang. RFC mengatakan untuk tidak menggunakan ulang harus ringan. Masalahnya, dengan layanan web, Anda harus mengambil pandangan negatif dan menganggap yang terburuk untuk aplikasi klien yang tidak dikenal. Sumber daya basi apa pun berpotensi menyebabkan masalah.

Dan hal lain yang baru saja saya pertimbangkan, tanpa Last-Modified atau ETags, browser hanya dapat mengambil seluruh sumber daya lagi. Namun dengan ETags, saya telah mengamati bahwa Chrome setidaknya tampaknya memvalidasi ulang pada setiap permintaan. Yang membuat kedua arahan ini diperdebatkan atau paling tidak buruk namanya karena mereka tidak dapat memvalidasi ulang dengan benar kecuali permintaan tersebut juga menyertakan tajuk lain yang kemudian menyebabkan 'selalu memvalidasi ulang'.

Saya hanya ingin memperjelas poin terakhir itu. Dengan hanya pengaturan must-revalidatetetapi tidak termasuk baik sebagai ETag atau Last-Modified, agen hanya bisa mendapatkan konten lagi karena tidak ada untuk mengirim ke server untuk membandingkan.

Namun, pengujian empiris saya menunjukkan bahwa ketika ETag atau data tajuk yang dimodifikasi dimasukkan dalam respons, agen tetap memvalidasi ulang, terlepas dari keberadaan must-revalidatetajuk.

Jadi intinya must-revalidateadalah untuk memaksa 'bypass cache' ketika basi, yang hanya dapat terjadi ketika Anda telah menetapkan seumur hidup / usia, sehingga jika must-revalidatediatur pada respons tanpa usia atau header lainnya, itu secara efektif menjadi setara dengan no-cachekarena responsnya akan segera dianggap basi.

- Jadi saya akhirnya akan menandai jawaban Gili!

Luke Puplett
sumber
Jadi dalam teori perbedaannya adalah validasi-selalu vs validasi-jika-basi , sedangkan dalam praktiknya tidak ada cache diperlakukan oleh browser tertentu seperti komentar yang Anda kutip mengatakan tidak pernah divalidasi ... jadi Anda harus menentukan pilihan mana yang akan digunakan berdasarkan perilaku caching apa yang sebenarnya ingin Anda capai dalam praktik ...
CBroe
Silakan baca greenbytes.de/tech/webdav/… dan lihat apakah ini menjelaskan segalanya untuk Anda.
Julian Reschke
periksa pohon keputusan ini untuk jawaban stackoverflow.com/a/49925190/3748498
pravdomil

Jawaban:

191

Saya percaya itu must-revalidateberarti:

Setelah cache kedaluwarsa, tolak untuk mengembalikan respons basi kepada pengguna bahkan jika mereka mengatakan bahwa tanggapan basi dapat diterima.

Sedangkan no-cachemenyiratkan:

must-revalidate ditambah fakta, responsnya menjadi basi segera.

Jika respons dapat disimpan dalam cache selama 10 detik, maka must-revalidatetendangan setelah 10 detik, sedangkan no-cachemenyiratkan must-revalidatesetelah 0 detik.

Setidaknya, itulah interpretasi saya.

Gili
sumber
2
Begitulah cara saya melihatnya sekarang. Bagian yang menarik adalah para terakhir saya, tanpa ETag atau Last-Modified, agen tidak memiliki apa-apa untuk memvalidasi apa yang ada dalam cache dan harus mengunduh seluruh muatan lagi. Jadi ketika RFC mengatakan "validasi ulang" itu mungkin berarti, ambil kembali.
Luke Puplett
44
Yang juga berarti max-age=0, must-revalidatedan no-cacheidentik
Anshul
5
@ Anshul, pada awalnya saya pikir Anda benar bahwa 'max-age = 0, harus divalidasi ulang dan tidak ada cache sama', tetapi lihat jawaban Jeffrey Fox yang sepertinya mengindikasikan itu tidak sepenuhnya benar.
Don Hatch
2
@Anshul Tidak, must-revalidatedan no-cachememiliki arti berbeda untuk respons baru: Jika respons yang di-cache segar (yaitu, respons belum kedaluwarsa), must-revalidateakan membuat proxy segera menayangkannya tanpa memvalidasi ulang dengan server, sedangkan dengan no-cacheproxy harus memvalidasi ulang tanggapan dalam cache terlepas dari kesegaran. Sumber: "HTTP - The Definitive Guide", halaman 182-183.
Matthias Braun
8
@MatthiasBraun Ah, saya bisa melihat sumber kebingungan. Mungkin saya seharusnya menulis no-cachedan max-age=0, must-revalidateidentik
Anshul
24

max-age=0, must-revalidatedan no-cachetidak persis sama. Dengan must-revalidate, jika server tidak menanggapi permintaan validasi ulang, browser / proxy seharusnya mengembalikan kesalahan 504. Dengan no-cache, itu hanya akan menunjukkan konten yang di-cache, yang mungkin akan disukai oleh pengguna (lebih baik memiliki sesuatu yang basi daripada tidak sama sekali). Inilah sebabnya mengapa must-revalidatedimaksudkan untuk transaksi kritis saja.

Jeffrey Fox
sumber
10
Tidak yakin dengan no-cacheinterpretasi Anda . Dari RFC 7234 Arahan respons "tanpa cache" menunjukkan bahwa respons tersebut TIDAK HARUS digunakan untuk memenuhi permintaan berikutnya tanpa validasi yang berhasil di server asal. Ini memungkinkan server asal untuk mencegah cache dari menggunakannya untuk memenuhi permintaan tanpa menghubunginya, bahkan oleh cache yang telah dikonfigurasi untuk mengirim tanggapan basi. Ini terdengar mirip dengan pembatasan untukmust-revalidate
Anshul
9
Apakah Jeffrey memiliki bukti bahwa implementasi berperilaku seperti yang ia gambarkan?
OrangeDog
Saya pikir jawaban ini benar untuk server proxy / lb. Tetapi memang, browser tidak mengembalikan 504 dalam kasus itu.
Yann Dìnendal
Jadi must-validateartinyamust-refresh
Simon_Weaver
15

Dengan interpretasi Jeffrey Fox tentang no-cache, saya telah menguji di bawah chrome 52.0.2743.116 m, hasilnya menunjukkan bahwa no-cachememiliki perilaku yang sama seperti must-revalidate, mereka semua TIDAK akan menggunakan cache lokal ketika server tidak terjangkau, dan, mereka semua akan menggunakan cache sambil mengetuk Back browser. / Tombol Forward ketika server tidak dapat dijangkau. Seperti di atas, saya pikir max-age=0, must-revalidateidentik dengan no-cache, setidaknya dalam implementasi.

Wilson Zeng
sumber
Akankah Chrome menggunakan cache lokal ketika server tersedia untuk memvalidasi ulang? (yaitu "Jika-Dimodifikasi-Sejak"). Dalam kedua kasus tersebut?
Kaya
-2

Saya pikir ada perbedaan antara max-age=0, must-revalidatedan no-cache:

Dalam must-revalidatehal klien diizinkan untuk mengirim If-Modified-Sincepermintaan dan melayani respons dari cache jika 304 Not Modifieddikembalikan.

Dalam hal no-cacheini, klien tidak harus menyimpan tanggapan, jadi jangan gunakan If-Modified-Since.

Kaya
sumber
6
Tetapi no-cachetidak berarti no-store- dengan no-cache, sumber daya masih bisa di-cache di klien; itu hanya harus divalidasi ulang sebelum digunakan?
Aron
4
Anda sedang bersatu no-cachedan no-store. no-cacheberarti sumber daya HARUS divalidasi ulang . Validasi kembali termasuk opsi untuk menggunakan permintaan bersyarat, seperti If-None-Matchdan If-Modified-Since.
Jules Sam. Randolph
1
@ JulesRandolph: Anda mungkin benar. Apakah Anda memiliki tes / demo? Semua pernyataan bebas bukti yang bertentangan tentang q ini membuat frustrasi. Bahkan jawaban yang diterima hanya mengatakan "Setidaknya, itu interpretasi saya". Saya mungkin menyiapkan test bed dan mempostingnya di sini jika saya punya waktu.
Kaya