304 Not Modified
Penggunaan
Kode status 304 Not Modified dikirim ketika permintaannya aman, seperti permintaan GET atau HEAD, dan server menentukan bahwa sumber daya tidak berubah sejak versi yang tersimpan di cache klien. Hal ini menghemat bandwidth karena server tidak mengirim ulang data yang sudah dimiliki klien.
Catatan
304 Not Modified bukanlah pengalihan meskipun berada dalam kelas status 3xx yang sama. Pengalihan (301, 302, 307, 308) mengarahkan klien ke URL lain melalui header Location. 304 memberi tahu klien untuk memakai kembali salinan cache dari sumber daya yang sama, dan tidak ada header Location yang dikirim. DevTools browser kadang mengelompokkan 304 bersama pengalihan, dan hal itu menambah kebingungan.
Catatan
“200 (from disk cache)” di DevTools berarti browser menyajikan sumber daya dari cache tanpa menghubungi server, karena Cache-Control max-age belum kedaluwarsa. 304 berarti browser menghubungi server untuk melakukan revalidasi dan server memastikan bahwa salinan cache masih mutakhir. Respons 200 dari cache sama sekali tidak melibatkan permintaan jaringan, sedangkan 304 melibatkan satu perjalanan bolak-balik.
Server menghasilkan satu atau beberapa header berikut dalam responsnya:
Karena tujuan respons 304 Not Modified adalah meminimalkan bandwidth, server menghilangkan header yang tidak disertakan dalam permintaan asli kecuali header tersebut membantu proses pembaruan cache.
Untuk permintaan GET bersyarat, direktif yang relevan adalah If-None-Match dan If-Modified-Since. Keduanya bergantung pada validator seperti ETag untuk menilai apakah sumber daya perlu dikirim ulang.
Contoh
Klien meminta sebuah sumber daya, menerima ETag yang mengidentifikasi versinya, lalu kemudian melakukan revalidasi. Server mengenali bahwa sumber daya tidak berubah dan mengembalikan 304 Not Modified. Pada permintaan ketiga, versi baru telah tersedia sehingga respons 200 lengkap dikirim beserta ETag yang diperbarui.
Catatan
Setiap kali server memperbarui sebuah sumber daya, ETag baru dihasilkan. Sebagai alternatif, server mengembalikan tanggal Last-Modified dan klien menggunakan If-Modified-Since, sehingga server tidak perlu memelihara riwayat ETag.
Dampak SEO
Ketika Googlebot menerima 304, crawler mengenali bahwa konten tidak berubah sejak perayapan terakhir. Pipeline pengindeksan menghitung ulang sinyal peringkat untuk URL tersebut, tetapi tidak mengambil ulang atau mengindeks ulang kontennya.
Jebakan 304 basi
Sebuah 304 memastikan bahwa versi di cache masih mutakhir. Ketika server sebelumnya menyajikan halaman rusak (badan kosong, konten error) dengan 200 dan crawler menyimpan hasilnya di cache, 304 berikutnya memberi tahu crawler bahwa versi rusak itu tetap berlaku. Crawler berhenti memeriksa ulang karena “konten” tidak berubah. Memperbaiki halaman saja tidak cukup. Server harus mengembalikan 200 baru dengan badan yang sudah diperbaiki (dan ETag baru) untuk menggantikan error yang tersimpan di cache. Mengawakutu skenario ini sulit karena akar masalahnya (sebuah error sementara di masa lalu) tidak lagi terlihat.
Permintaan awal
GET /news.html HTTP/1.1
Host: example.com
Respons awal
HTTP/1.1 200 OK
ETag: "1234000"
Content-Type: text/html
Content-Length: 1250
<message body contains requested resource>
Permintaan kedua
GET /news.html HTTP/1.1
Host: example.com
If-None-Match: "1234000"
Respons kedua
HTTP/1.1 304 Not Modified
ETag: "1234000"
Permintaan ketiga
GET /news.html HTTP/1.1
Host: example.com
If-None-Match: "1234000"
Respons ketiga
HTTP/1.1 200 OK
ETag: "1234001"
Content-Type: text/html
Content-Length: 1600
<message body contains requested resource>
Referensi kode
.NET
HttpStatusCode.NotModified
Rust
http::StatusCode::NOT_MODIFIED
Rails
:not_modified
Go
http.StatusNotModified
Symfony
Response::HTTP_NOT_MODIFIED
Python3.5+
http.HTTPStatus.NOT_MODIFIED
Java
java.net.HttpURLConnection.HTTP_NOT_MODIFIED
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_NOT_MODIFIED
Angular
@angular/common/http/HttpStatusCode.NotModified