406 Not Acceptable
Penggunaan
Ketika error 406 Not Acceptable muncul, respons tersebut dipicu oleh header yang berkaitan dengan negosiasi seperti Accept atau Accept-Language. Ketika klien menyertakan satu atau beberapa header ini, server akan memenuhi persyaratan tersebut bila memungkinkan.
Header Accept HTTP yang paling umum adalah:
Accept: Menentukan tipe konten yang disukai. Server menyediakan representasi berupa teks biasa atau HTML. Pada contoh ini, klien lebih menyukai HTML tetapi menerima teks biasa.
Accept: text/html, text/plain
Accept-Encoding: Menentukan encoding yang diterima klien. Pada contoh ini, klien menyatakan dukungan untuk kompresi gzip.
Accept-Encoding: gzip
Dalam praktiknya, error ini jarang digunakan karena server justru menyediakan representasi default. Alasannya adalah asumsi bahwa klien lebih memilih sesuatu daripada tidak sama sekali. Ketika respons 406 Not Acceptable dikembalikan, body pesan berisi daftar representasi yang tersedia untuk dipilih klien.
Catatan
406 Not Acceptable berarti server tidak dapat menghasilkan respons yang cocok dengan header Accept dari klien (masalah format keluaran). 415 Unsupported Media Type berarti server tidak memahami Content-Type dari body permintaan (masalah format masukan). 406 berkaitan dengan apa yang ingin diterima klien, sedangkan 415 berkaitan dengan apa yang dikirim klien.
Dampak SEO
Mesin pencari seperti Google tidak mengindeks URL yang mengembalikan status 406 Not Acceptable. URL yang sebelumnya terindeks dan mengembalikan kode status ini akan dihapus dari hasil pencarian.
Contoh
Klien meminta sebuah sumber daya dalam bahasa Prancis, tetapi server merespons dengan 406 Not Acceptable karena hanya tersedia versi bahasa Jerman dan Inggris.
Permintaan
GET /news HTTP/1.1
Host: example.com
Accept-Language: fr
Respons
HTTP/1.1 406 Not Acceptable
Content-Type: text/html
Content-Length: 242
<html>
<head>
<title>French Language Not Available</title>
</head>
<body>
<p>Please choose a supported language:</p>
<p><a href="/news/news-de.html">German</a></p>
<p><a href="/news/news-en.html">English</a></p>
</body>
</html>
Cara memperbaiki
406 Not Acceptable berarti server tidak memiliki representasi yang cocok dengan header negosiasi konten dari klien.
Tinjau header Accept. Perluas tipe media yang diterima. Misalnya, tambahkan application/json di samping text/html, atau gunakan / untuk menerima format apa pun. Gunakan DevTools browser (tab Network) atau curl -v untuk memeriksa header Accept persis yang dikirim klien.
Periksa batasan Accept-Language. Meminta bahasa yang tidak didukung server akan memicu error ini. Perluas daftar bahasa atau tambahkan fallback wildcard (*). Pengaturan bahasa browser mengendalikan header ini secara otomatis. Sesuaikan melalui preferensi bahasa di browser.
Hapus nilai Accept-Encoding atau Accept-Charset yang terlalu membatasi. Persyaratan encoding atau charset yang sempit membatasi pilihan server. Izinkan nilai umum seperti gzip, deflate dan UTF-8.
Periksa body respons untuk melihat alternatif yang tersedia. Server sering mencantumkan representasi yang didukung di dalam respons 406. Pilih salah satu dan sesuaikan header negosiasi sesuai pilihan tersebut.
Periksa konfigurasi negosiasi konten di sisi server. Type map yang salah konfigurasi atau registrasi tipe MIME yang hilang di server menyebabkan respons 406 yang tidak terduga. Di Apache, mod_negotiation dan MultiViews mengendalikan type map. Pastikan direktif AddType mendaftarkan tipe MIME yang dibutuhkan.
Periksa aturan mod_security atau WAF. mod_security milik Apache (dan WAF sejenis) mencegat permintaan dan mengembalikan 406 ketika sebuah aturan terpicu oleh isi permintaan, bukan oleh header Accept. Periksa log error server untuk entri ModSecurity dan catat ID aturannya (misalnya, [id “941160”]). Masukkan aturan spesifik tersebut ke daftar izin alih-alih menonaktifkan WAF sepenuhnya:
SecRuleRemoveById 941160
Tempatkan pengecualian tersebut di konfigurasi virtual host atau berkas .htaccess.
Uji dengan permintaan minimal. Hapus semua header negosiasi dan kirim permintaan polos dengan curl untuk menentukan apakah server mengembalikan representasi default. Jika permintaan polos tersebut berhasil, tambahkan kembali header negosiasi satu per satu untuk mengisolasi header mana yang memicu penolakan.
Verifikasi negosiasi versi API. Sebagian API menggunakan header Accept untuk penomoran versi (misalnya, application/vnd.api.v2+json). Mengirim string versi yang tidak didukung menghasilkan 406. Pastikan nilai versinya sesuai dengan dokumentasi API.
Referensi kode
.NET
HttpStatusCode.NotAcceptable
Rust
http::StatusCode::NOT_ACCEPTABLE
Rails
:not_acceptable
Go
http.StatusNotAcceptable
Symfony
Response::HTTP_NOT_ACCEPTABLE
Python3.5+
http.HTTPStatus.NOT_ACCEPTABLE
Java
java.net.HttpURLConnection.HTTP_NOT_ACCEPTABLE
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_NOT_ACCEPTABLE
Angular
@angular/common/http/HttpStatusCode.NotAcceptable