Apa perbedaan antara kode status HTTP 200 (cache) vs kode status 304?

201

Saya menggunakan plug-in "Kecepatan Halaman" Google untuk Firefox untuk mengakses situs web saya.

Beberapa komponen pada halaman saya diindikasikan sebagai status HTTP:

200 200 (cache) 304

Oleh "Kecepatan Halaman" Google.

Yang saya bingung adalah perbedaan antara 200 (cache) dan 304.

Saya telah me-refresh halaman beberapa kali (tetapi belum membersihkan cache saya) dan selalu tampak bahwa favicon.ico saya dan beberapa gambar berstatus = 200 (cache) sementara beberapa gambar lainnya adalah http status 304.

Saya tidak mengerti mengapa bedanya.

MEMPERBARUI :

Menggunakan Google "Kecepatan Halaman", saya menerima "200 (cache)" untuk http://example.com/favicon.ico dan juga http://cdn.example.com/js/ga.js

Tapi, saya menerima status http "304" untuk http://cdn.example.com/js/combined.min.js

Saya tidak mengerti mengapa saya memiliki dua file JavaScript yang terletak di direktori yang sama / js /, satu mengembalikan status http 304 dan yang lainnya mengembalikan kode status 200 (cache).

Gulungan
sumber

Jawaban:

220

Item dengan kode "200 (cache)" dipenuhi langsung dari cache browser Anda, yang berarti bahwa permintaan asli untuk item dikembalikan dengan tajuk yang menunjukkan bahwa browser dapat menyimpannya (misalnya di masa mendatang ExpiresatauCache-Control: max-age header), dan bahwa pada saat Anda memicu permintaan baru, objek yang di-cache itu masih disimpan dalam cache lokal dan belum kedaluwarsa.

304s, di sisi lain, adalah respons dari server setelah browser memeriksa apakah file telah dimodifikasi sejak versi terakhir yang di-cache (jawabannya adalah "tidak").

Untuk kinerja web yang paling optimal, Anda sebaiknya mengatur masa depan yang jauh Expires:atau Cache-Control: max-ageheader untuk semua aset, dan kemudian ketika suatu aset perlu diubah, mengubah nama file aktual dari aset atau menambahkan string versi ke permintaan untuk aset tersebut. Ini menghilangkan kebutuhan untuk setiap permintaan yang akan dibuat kecuali aset telah benar-benar berubah dari versi dalam cache (tidak perlu untuk 304 tanggapan). Google memiliki lebih banyak detail tentang penggunaan caching jangka panjang yang benar .

Ben Regenspan
sumber
2
Jadi apa yang lebih baik dari perspektif kecepatan ... "200 (cache)" atau "304" pesan status http?
Hank
22
200 cache. Beberapa catatan bagus tentang ini di sini: developer.yahoo.com/performance/rules.html#expires . Anda ingin waktu kedaluwarsa sebanyak mungkin pada aset Anda, tetapi harus menyeimbangkan ini dengan fakta bahwa Anda kehilangan sejumlah kontrol dengan cara ini. Satu hal yang dapat Anda lakukan adalah mengatur kadaluarsa jangka panjang pada file, dan kemudian ketika perlu menambah nomor versi aset untuk file-file tersebut. Misalnya, Anda bisa menyertakan style.css? V1 dan selisih di elemen <link> ke style.css? V2 saat ada perubahan.
Ben Regenspan
1
Keadilan, jadi mengapa Firebug melaporkan bahwa untuk ga.js ditarik dari cache lokal (status = 200 cache) sementara gabungan.min.js melaporkan status 304 http. Yang aneh adalah kedua file tersebut memiliki tipe file yang sama (JavaScript) dan berada di direktori server yang sama. Anda akan berpikir keduanya akan baik 200 atau 304, dan tidak berbeda
Hank
8
The max-agedan ageheader gabungan juga dapat mengakibatkan 200 (cache) hasil jika agekurang dari max-age. Satu-satunya pengecualian adalah ketika pengguna mengklik tombol refresh browser, dalam hal ini header 304 dikirim.
yitwail
2
HTML5 Boilerplate merekomendasikan agar tidak menggunakan metode string kueri cache-busting - lebih baik untuk mengubah href, url,dan srcreferensi ke setiap file untuk menyertakan 'sidik jari' (baik hash file atau angka sederhana yang ditingkatkan), dan kemudian beri tahu server untuk menghilangkan sidik jari itu dan hanya melayani style.cssatau apa pun. Jika Anda tidak dapat melakukannya di server, minta sistem build Anda mengganti nama file aktual dengan sidik jari.
iono
62

200 (cache) berarti Firefox hanya menggunakan versi yang di-cache secara lokal. Ini adalah yang tercepat karena tidak ada permintaan ke server Web dibuat.

304 berarti Firefox mengirim permintaan bersyarat "Jika-Dimodifikasi-Sejak" ke server Web. Jika file belum diperbarui sejak tanggal dikirim oleh browser, server Web mengembalikan respons 304 yang pada dasarnya memberitahu Firefox untuk menggunakan versi yang di-cache. Ini tidak secepat 200 (cache) karena permintaan masih dikirim ke server Web, tetapi server tidak harus mengirim konten file.

Untuk pertanyaan terakhir Anda, saya tidak tahu mengapa kedua file JavaScript di direktori yang sama menghasilkan hasil yang berbeda.

James Lawruk
sumber
18

Ini melempar saya untuk waktu yang lama juga. Hal pertama yang saya verifikasi adalah Anda tidak memuat ulang halaman dengan mengklik tombol refresh, yang akan selalu mengeluarkan permintaan bersyarat untuk sumber daya dan akan mengembalikan 304 untuk banyak elemen halaman. Alih-alih pergi ke bilah url pilih halaman dan tekan enter seolah-olah Anda baru saja mengetikkan URL yang sama, yang akan memberi Anda indikator yang lebih baik tentang apa yang sedang di-cache dengan benar. Artikel ini melakukan pekerjaan yang hebat menjelaskan perbedaan antara permintaan bersyarat dan tanpa syarat dan bagaimana tombol refresh mempengaruhi mereka: http://blogs.msdn.com/b/ieinternals/archive/2010/07/08/technical-information-about- conditional-http-request-and-the-refresh-button.aspx

Anjing
sumber
1
Saya bahkan tidak bisa menggambarkan berapa banyak waktu yang saya habiskan untuk mencari tahu 304 status permintaan ke CDN. Meskipun Anda menjawab pertanyaan yang sedikit berbeda, Anda layak mendapatkan hadiah :-)
Peeech
Anda benar: perbedaan kode terkait dengan fakta bahwa Anda memuat ulang atau tidak halaman yang sama. Jika saya memuat ulang halaman, saya melihat di monitor jaringan browser kode 304. Tetapi, jika saya mengakses URL lain, yang menggunakan file-file yang sama ini, saya melihat di monitor jaringan browser kode 200 (dari cache). Dalam kasus saya, URL lainnya hanyalah string kueri yang ditambahkan ke URL asli (halaman tersebut adalah dasarnya sama).
aldemarcalazans
8

HTTP 304 "tidak dimodifikasi". Server web Anda pada dasarnya memberi tahu peramban "file ini belum berubah sejak terakhir kali Anda memintanya." Sedangkan HTTP 200 memberi tahu browser "ini adalah respons yang berhasil" - yang harus dikembalikan ketika pertama kali browser Anda mengakses file atau saat pertama kali salinan yang dimodifikasi diakses.

Untuk info lebih lanjut tentang kode status, periksa http://en.wikipedia.org/wiki/List_of_HTTP_status_codes .

tanah kaya
sumber
Itu pemahaman saya juga ... itulah sebabnya saya menyatakan dalam posting asli saya bahwa saya telah me-refresh halaman saya beberapa kali dan saya masih mendapatkan "200 (cache)" untuk favicon.ico yang sama dan termasuk JavaScript tertentu yang saya miliki. Sangat aneh
Hank
2
200 sebenarnya tidak berarti di-cache, itu hanya berarti OK. Kemungkinannya adalah bahwa konfigurasi server Anda tidak secara eksplisit memberi tahu peramban untuk men-cache file ico dan js Anda, yang akan membuatnya mengembalikan kode status 200.
richleland
Itu bukan kasus b / c pada beberapa JavaScript saya, saya menerima 304 dan JavaScript lainnya saya mendapat "200 (cache)". Semua JavaScript berada dalam direktori web server yang sama contoh.com/js/
Hank
Saya harus menambahkan bahwa 200 (cache) hanya berarti itu di-cache secara lokal dan tidak benar-benar membuat permintaan ke server, yang akan lebih cepat daripada pergi ke server dan mendapatkan tanggapan 304.
richleland
Saya telah memperbarui posting asli saya untuk menampilkan situs langsung saya dan JavaScript yang dimaksud. Silakan lihat posting asli saya yang diperbarui.
Hank
2

Untuk pertanyaan terakhir Anda, mengapa? Saya akan mencoba menjelaskan dengan apa yang saya ketahui

Penjelasan singkat tentang ketiga kode status dalam istilah awam.

  • 200 - sukses (permintaan browser dan mendapatkan file dari server)

Jika caching diaktifkan di server

  • 200 (dari cache memori) - file ditemukan di browser, jadi browser tidak meminta dari server
  • 304 - browser meminta file tetapi ditolak oleh server

Untuk beberapa file browser memutuskan untuk meminta dari server dan untuk beberapa file memutuskan untuk membaca dari file yang disimpan (di-cache). Kenapa ini ? Setiap file memiliki tanggal kedaluwarsa, jadi

Jika file tidak kedaluwarsa maka browser akan menggunakan dari cache (200 cache).

Jika file kedaluwarsa, browser meminta server untuk file tersebut. Server memeriksa file di kedua tempat (browser dan server). Jika file yang sama ditemukan, server menolak permintaan tersebut. Sesuai protokol, browser menggunakan file yang ada.

lihat konfigurasi nginx ini

location / {
    add_header Cache-Control must-revalidate;
    expires     60;
    etag on;

    ...
}

Di sini kedaluwarsa diatur ke 60 detik, sehingga semua file statis di-cache selama 60 detik. Jadi jika Anda meminta file lagi dalam 60 detik browser akan membaca dari memori (200 memori). Jika Anda meminta setelah 60 detik, browser akan meminta server (304).

Saya berasumsi bahwa file tidak berubah setelah 60 detik, dalam hal ini Anda akan mendapatkan 200 (yaitu, file yang diperbarui akan diambil dari server).

Jadi, jika server dikonfigurasi dengan header (kebijakan) kedaluwarsa dan caching yang berbeda, statusnya mungkin berbeda.

Jika Anda menggunakan cdn, tujuan utama cdn adalah ketersediaan tinggi dan pengiriman cepat. Karena itu mereka menggunakan banyak server. Meskipun sepertinya file berada di direktori yang sama, cdn mungkin menggunakan beberapa server untuk menyediakan konten Anda, jika server tersebut memiliki konfigurasi yang berbeda. Maka status ini dapat berubah. Semoga ini bisa membantu.

Saahithyan Vigneswaran
sumber
The 304 - Not Modified bukan "penolakan" oleh server. Ini adalah server yang menyatakan kepada klien "untuk versi yang Anda minta, saya tahu itu tidak dimodifikasi, Anda tidak benar-benar membutuhkan file". Secara teknis, 304 adalah salah satu kode respons "redirection". Ini memberi tahu klien "dapatkan dari cache Anda sendiri".
Bob Kuhar