Bagaimana cara kerja "304 Not Modified"?

175
  • Bagaimana tanggapan "304 Tidak Dimodifikasi" dihasilkan?

  • Bagaimana cara browser menentukan apakah respons terhadap permintaan HTTP adalah 304?

  • Apakah diatur oleh browser atau dikirim dari server?

  • Jika dikirim oleh server, bagaimana server mengetahui data yang tersedia dalam cache, juga bagaimana cara mengatur 304 ke gambar?

Dugaan saya, jika itu dihasilkan oleh browser:

function is_modified()
{
    return get_data_from_cache() === get_data_from_url();
}

function get_data_from_cache()
{
    return some_hash_or_xxx_function(cache_data);
}

function get_data_from_url()
{
     return some_hash_or_xxx_function(new_data);
}

function some_hash_or_xxx_function(data)
{
     // Do something with the data.
     // What is that algorithm?
     return result;
}

console.log(is_modified());

Saya mengandalkan penyedia API pihak ketiga untuk mendapatkan data, parsing & dorong ke basis data saya. Data mungkin atau mungkin tidak berubah selama setiap permintaan, tetapi tajuk selalu mengirim 200. Saya tidak ingin menguraikan, periksa ID Unik terakhir di DB dan seterusnya ... untuk menentukan perubahan data, atau membandingkan hasilnya secara langsung, bukan saya md5(), sha1()dan crc32()mengait hasilnya dan berfungsi dengan baik, tapi saya ingin tahu tentang algoritma untuk menentukan 304.

Saya ingin menggunakan jenis algoritma yang sama untuk menentukan perubahan data saya.

VenomVendor
sumber
2
Ya saya mencari di Google untuk bagaimana 304 tidak dimodifikasi bekerja , tetapi tidak mendapatkan jawaban.
VenomVendor
1
Anda harus lebih umum. google.com/search?q=http%20caching
SLaks

Jawaban:

201

Saat browser memasukkan sesuatu ke dalam cache, browser juga menyimpan header Last-Modifiedatau ETagdari server.

Browser kemudian mengirimkan permintaan dengan header If-Modified-Sinceatau If-None-Match, memberitahu server untuk mengirim 304 jika konten masih memiliki tanggal atau ETag.

Server membutuhkan cara menghitung ETAG yang dimodifikasi tanggal atau untuk setiap versi sumber daya masing-masing; ini biasanya berasal dari sistem file atau kolom database terpisah.

Slaks
sumber
1
ETagadalah kata kunci, diperiksa dengan tajuk ETagtetap sama di kedua Response Headers& Response Headers From Cache, dapatkah Anda memberi tahu algoritma di belakang ETag. Saya telah memperbarui pertanyaan saya yang menyatakan kebutuhan saya.
VenomVendor
4
@VenomVendor: ETaghanyalah bidang di mana server dapat menyimpan ID unik (biasanya hash atau nomor versi atau jam vektor). Sama sekali tidak membantu Anda menghitung ID itu; itu terserah kode sisi server Anda.
SLaks
@SLaks: Apa yang terjadi jika halaman memiliki panggilan db ... Ada kemungkinan bahwa data dalam db akan berubah .. Dalam hal ini tidak masuk akal untuk memeriksa panggilan yang terakhir diubah, Benar ?. . Bagaimana kondisi ini dilihat?
user1050619
3
@ user1050619: Terserah server Anda untuk memastikan bahwa ETag akurat. Jika Anda menunjukkan data dari DB, Anda harus memasukkannya.
SLaks
Satu hal yang masih belum jelas adalah apakah jika Anda memiliki yang besar max-agemaka apakah browser perlu membuat permintaan? (karena bisa mematikan di 304 dan tidak membuat permintaan sama sekali) ... Anda ingin ini misalnya dengan aset "sidik jari" (mereka baik selamanya). Lain apa gunanya max-age...
Andy Hayden
19

Terakhir Dimodifikasi: Tanggal modifikasi terakhir untuk objek yang diminta

Jika-Dimodifikasi-Sejak: Memungkinkan 304 Tidak Dimodifikasi untuk dikembalikan jika tanggal modifikasi terakhir tidak berubah.

ETag: ETag adalah pengidentifikasi buram yang diberikan oleh server web ke versi spesifik sumber daya yang ditemukan di URL. Jika representasi sumber daya di URL itu pernah berubah, ETag baru dan berbeda ditugaskan.

If-None-Match: Memungkinkan 304 Tidak Dimodifikasi untuk dikembalikan jika ETag tidak berubah.

cache toko browser dengan tanggal (Diubah Terakhir) atau id (ETag), ketika Anda perlu meminta URL lagi, browser mengirim pesan permintaan dengan header:

masukkan deskripsi gambar di sini

server akan mengembalikan 304 ketika pernyataan if False, dan browser akan menggunakan cache.

宏杰 李
sumber