HTTPQUERY
Bahasa Indonesia

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