416 Range Not Satisfiable
Penggunaan
Ketika pesan error 416 Range Not Satisfiable diterima, klien telah meminta sebagian konten menggunakan header Range. Untuk rentang byte, jika byte pertama dari rentang yang ditentukan lebih besar daripada panjang sumber daya, error ini dikembalikan.
Salah satu alasan rentang parsial diminta adalah transfer berkas berukuran besar, ketika klien ingin mengunduh berkas dalam potongan-potongan. Dengan menggunakan header Range di dalam permintaan, sebuah berkas secara efektif dapat diunduh per bagian dan dalam urutan mana pun.
Ketika server memenuhi permintaan dan mengembalikan setidaknya salah satu rentang yang diminta sebagai bagian dari sumber daya, 206 dikembalikan untuk menandakan keberhasilan. Server memiliki opsi untuk mengabaikan permintaan rentang dan mengembalikan sumber daya secara utuh dengan status 200.
Sebagai bagian dari respons, server membuat header Content-Range yang menentukan panjang data saat ini:
Content-Range: bytes */512
Tanda bintang * sebelum pembatas / menandakan rentang yang tidak dapat dipenuhi, diikuti oleh ukuran total sumber daya.
Dampak SEO
Mesin pencari seperti Google tidak akan mengindeks URL dengan status respons 416. URL yang sebelumnya terindeks akan dihapus dari hasil pencarian.
Contoh
Klien meminta byte 1000 hingga 2000 dari sebuah sumber daya. Server mengembalikan 416 Range Not Satisfiable karena berkasnya hanya berukuran 512 byte. Dengan menggunakan informasi ukuran total yang dikembalikan server, klien menyusun ulang permintaan dengan rentang yang valid.
Permintaan
GET /documents/main HTTP/1.1
Host: example.com
Range: bytes=1000-2000
Respons
HTTP/1.1 416 Range Not Satisfiable
Content-Range: bytes */512
Respons alternatif ketika server mengabaikan rentang tersebut
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 512
<entire 512 bytes in message body>
Cara memperbaiki
Header Range menentukan rentang byte di luar batas sumber daya. Penyebab yang paling umum adalah meminta byte di luar akhir berkas (misalnya, meminta byte 1000-2000 dari berkas yang hanya berukuran 512 byte).
Verifikasi ukuran sumber daya terlebih dahulu. Kirim permintaan HEAD untuk membaca header Content-Length sebelum menyusun permintaan rentang. Ini mencegah permintaan byte di luar batas berkas.
Periksa perhitungan rentang byte. Rentang byte dimulai dari indeks nol dan inklusif di kedua ujungnya. Berkas berukuran 512 byte memiliki posisi byte valid 0 hingga 511. Rentang bytes=0-511 meminta seluruh isi berkas. Kesalahan selisih satu (off-by-one) dalam perhitungan rentang merupakan sumber respons 416 yang sering terjadi.
Tangani perubahan sumber daya. Saat melanjutkan unduhan, berkas di server mungkin telah berubah atau dihapus sejak permintaan parsial terakhir. Rentang yang valid untuk versi sebelumnya menjadi tidak valid untuk berkas yang lebih pendek atau berbeda. Periksa kembali ukuran sumber daya sebelum melanjutkan.
Hapus header Range. Ketika konten parsial tidak diperlukan, hapus header Range untuk meminta sumber daya secara penuh. Server akan mengembalikan 200 beserta body lengkapnya.
Bersihkan cache browser. Browser kadang menyimpan respons parsial di cache dan menyusun permintaan rentang yang tidak valid pada kunjungan berikutnya. Membersihkan cache memaksa permintaan penuh yang baru.
Pertimbangan di sisi server. Sebagian konfigurasi server membatasi jenis sumber daya mana yang mendukung permintaan rentang. Pastikan server mengirim Accept-Ranges: bytes pada respons untuk sumber daya yang dituju. Ketika Accept-Ranges: none hadir, server sama sekali tidak mendukung permintaan parsial untuk sumber daya tersebut.
Kegagalan pemuatan media
Pemutar video dan audio di browser mengirim permintaan rentang untuk melakukan streaming berkas media. Error 416 saat pemutaran berarti pemutar meminta rentang byte di luar batas berkas. Hal ini terjadi ketika berkas media diganti dengan versi yang lebih pendek sementara pemutar masih memegang nilai Content-Length yang usang. Memuat ulang halaman memaksa pemutar mengambil ukuran berkas saat ini sebelum meminta rentang.
Referensi kode
.NET
HttpStatusCode.RequestedRangeNotSatisfiable
Rust
http::StatusCode::RANGE_NOT_SATISFIABLE
Rails
:range_not_satisfiable
:requested_range_not_satisfiable
Go
http.StatusRequestedRangeNotSatisfiable
Symfony
Response::HTTP_REQUESTED_RANGE_NOT_SATISFIABLE
Python3.5+
http.HTTPStatus.REQUESTED_RANGE_NOT_SATISFIABLE
Java
HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_REQUESTED_RANGE_NOT_SATISFIABLE
Angular
@angular/common/http/HttpStatusCode.RangeNotSatisfiable