ERR_HTTP2_PROTOCOL_ERROR: arti dan cara mengatasinya
Poin penting
ERR_HTTP2_PROTOCOL_ERROR (error Chromium -337) berarti stream HTTP/2 yang membawa halaman gagal. Bisa jadi server, proxy, atau CDN mereset-nya di tengah jalan (Chrome melaporkan setiap reset seperti itu sebagai -337), atau Chrome menolak header yang melanggar aturan HTTP/2. Bagi pengunjung, memuat ulang, membuka jendela Incognito, menghapus cookie situs, atau menjeda pemindaian HTTPS antivirus kadang bisa melewatinya, tetapi biasanya hanya situs itu sendiri yang bisa memperbaikinya. Bagi pemilik situs, penyebab umumnya adalah respons yang tidak bisa diselesaikan server atau proxy (disk penuh, folder temp yang tidak bisa ditulisi, aplikasi yang crash), Content-Length yang tidak sesuai dengan body, atau header terlarang seperti Transfer-Encoding. Reproduksi dengan curl --http2 -v.
Periksa sekarang

Mulai membaca
- Apa itu ERR_
HTTP2_ PROTOCOL_ ERROR? - Apa yang dianggap rusak oleh HTTP/2
- Apa penyebab ERR_
HTTP2_ PROTOCOL_ ERROR? - Solusi 1: hard reload dan coba Incognito
- Solusi 2: hapus cookie dan file tersimpan situs itu
- Solusi 3: jeda pemindaian HTTPS antivirus dan ekstensi
- Solusi 4: perbarui Chrome dan coba browser lain
- Solusi 5: uji halaman tanpa HTTP/2
- Untuk pemilik situs: mengatasi error protokol HTTP/2
- 1. Reproduksi dengan curl
- 2. Periksa respons yang terpotong di tengah jalan
- 3. Perbaiki Content-Length dan header terlarang
- ERR_
HTTP2_ PROTOCOL_ ERROR vs error serupa - Pertanyaan yang Sering Diajukan
Apa itu ERR_HTTP2_PROTOCOL_ERROR?
ERR_HTTP2_PROTOCOL_ERROR adalah error Chrome dan Edge yang berarti stream HTTP/2 yang membawa halaman gagal: server mereset-nya sebelum selesai atau mengirim header yang ditolak browser. Di Chromium, ini adalah net error -337: "There is an HTTP/2 protocol error" (net_error_list.h). Chrome tidak punya halaman error khusus untuk kode ini, jadi yang muncul adalah halaman generik: "Situs ini tidak dapat dijangkau" dengan keterangan "Halaman web di … mungkin sedang tidak aktif untuk sementara atau dipindahkan secara permanen ke alamat web baru", lalu ERR_HTTP2_PROTOCOL_ERROR di bawahnya. Edge menampilkan kode yang sama di layar miliknya sendiri, "Hmm… can't reach this page".
HTTP/2 adalah versi HTTP yang lebih cepat dan kini dipakai sebagian besar situs HTTPS. Setiap permintaan berjalan sebagai stream tersendiri di dalam satu koneksi, dan kedua pihak bisa membatalkan stream dengan reset. Chrome melaporkan setiap reset dari server sebagai error protokol, apa pun alasan server, dan juga membatalkan stream sendiri ketika header melanggar aturan HTTP/2 (header Transfer-Encoding, huruf kapital di nama header, status yang hilang).
Developer sering melihatnya di konsol DevTools sebagai net::ERR_HTTP2_PROTOCOL_ERROR 200 (OK). Kombinasi itu adalah petunjuk kuat: header valid dan server menjawab 200, tetapi stream gagal saat body sedang tiba.
Lihat header yang benar-benar dikirim sebuah halaman
Apa yang dianggap rusak oleh HTTP/2
Standar HTTP/2 (RFC 9113) mendaftar kesalahan yang membuat sebuah respons dianggap rusak (malformed). Inilah masalah di balik sebagian besar error di dunia nyata, beserta cara masing-masing sampai ke browser:
| Aturan | Yang melanggarnya |
|---|---|
| Content-Length harus sama dengan ukuran body | Server atau plugin mendeklarasikan satu ukuran tetapi mengirim ukuran lain; proxy, CDN, atau server di depannya lalu mereset stream |
| Respons harus berakhir dengan bersih | Server, proxy, atau aplikasi tidak bisa menyelesaikan respons (disk penuh, crash, timeout) dan mereset stream; nginx melakukannya saat tidak bisa menuntaskan respons yang sudah dimulai |
| Tidak boleh ada header khusus koneksi | Transfer-Encoding dalam respons HTTP/2 (ditolak Chrome); Connection, Keep-Alive, Proxy-Connection, dan Upgrade juga dilarang, dan client yang ketat seperti curl menolaknya |
| Nama field harus huruf kecil | Nama header berhuruf kapital yang diteruskan begitu saja ke HTTP/2 |
| Nilai header harus valid | Baris baru atau karakter terlarang lain di dalam nilai header |
| Baris :status yang valid | Kode status yang hilang atau tidak bisa dibaca |
Apa penyebab ERR_HTTP2_PROTOCOL_ERROR?
Sebagian besar kasus berasal dari sisi server, tetapi beberapa hal di komputer Anda sendiri bisa merusak respons dalam perjalanannya:
- Di server: respons yang tidak bisa diselesaikan server atau proxy (proxy yang kehabisan ruang disk atau tidak bisa menulis file temp-nya, aplikasi yang crash saat streaming, timeout), nilai Content-Length yang salah sehingga proxy di depannya menyerah, header yang terlarang atau tidak valid, serta dukungan HTTP/2 yang bermasalah di konfigurasi server atau CDN yang lebih lama.
- Di sisi Anda: antivirus atau firewall yang memeriksa HTTPS dan menulis ulang lalu lintas, ekstensi browser yang mengubah permintaan atau respons, permintaan yang salah ditangani server (misalnya cookie yang terlalu besar), dan sesekali versi Chrome yang usang.
Solusi 1: hard reload dan coba Incognito
Tekan Ctrl + Shift + R (Mac: Cmd + Shift + R) untuk memuat ulang tanpa cache. Respons yang sekali terpotong mungkin tiba dengan utuh pada percobaan berikutnya.
Lalu buka halaman di jendela Incognito (Ctrl + Shift + N, Mac Cmd + Shift + N). Incognito tidak memakai cookie maupun cache dari profil normal Anda, dan ekstensi nonaktif secara default. Jika halaman terbuka di sana, Solusi 2 atau Solusi 3 akan mengatasinya di jendela normal Anda.
Solusi 2: hapus cookie dan file tersimpan situs itu
Menghapus cookie dan file tersimpan situs mengubah permintaan yang dikirim Chrome (cookie lebih sedikit, tidak ada salinan cache untuk divalidasi ulang), sehingga bisa menghindari bug di server. Klik ikon Lihat informasi situs di sebelah kiri address bar → Cookie dan data situs → Kelola data situs di perangkat → hapus datanya, lalu muat ulang. Untuk pembersihan yang lebih luas, tekan Ctrl + Shift + Delete lalu hapus Gambar dan file dalam cache untuk 7 hari terakhir.
Solusi 3: jeda pemindaian HTTPS antivirus dan ekstensi
Perangkat lunak keamanan yang mendekripsi dan memeriksa HTTPS berada di tengah setiap koneksi HTTP/2. Jika penanganan HTTP/2-nya bermasalah atau usang, perangkat lunak itu bisa merusak stream atau meneruskan header yang ditolak Chrome. Matikan hanya fitur pemindaian HTTPS-nya (Avast/AVG: Web Shield → "Enable HTTPS scanning"; ESET: "SSL/TLS protocol filtering"; Kaspersky: "Scan encrypted connections") lalu muat ulang. Jika itu mengatasinya, perbarui antivirus dan tambahkan pengecualian untuk situs tersebut.
Selanjutnya, nonaktifkan semua ekstensi di chrome://extensions, muat ulang, lalu aktifkan kembali satu per satu. Pemblokir iklan, alat privasi, dan apa pun yang mengedit header adalah tersangka yang biasa.
Solusi 4: perbarui Chrome dan coba browser lain
Buka chrome://settings/help untuk memasang pembaruan yang tertunda, lalu restart browser. Setelah itu buka halaman yang sama di Firefox atau Safari, serta di perangkat atau jaringan lain. Jika gagal di mana-mana, situsnya yang rusak dan hanya pemiliknya yang bisa memperbaikinya (pemindaian HTTPS antivirus memengaruhi semua browser di satu komputer, jadi perangkat kedua adalah ujian yang sebenarnya). Jika hanya Chrome atau Edge yang gagal, situs itu kemungkinan mengirim header yang ditolak Chrome; Solusi 2 dan 3 tetap layak diulang.
Solusi 5: uji halaman tanpa HTTP/2
Chrome bisa dijalankan dengan HTTP/2 (dan HTTP/3) dimatikan, sehingga terlihat apakah HTTP/2 terlibat. Jalankan Chrome kedua yang terpisah dari terminal; folder profil tambahan membuatnya menjadi instance baru meskipun Chrome normal Anda sedang terbuka:
# Windows (Command Prompt)
"C:\Program Files\Google\Chrome\Application\chrome.exe" --user-data-dir="%TEMP%\h2test" --disable-http2 --disable-quic
# macOS (Terminal)
open -na "Google Chrome" --args --user-data-dir=/tmp/h2test --disable-http2 --disable-quicJika halaman terbuka di jendela itu, respons HTTP/2 situs tersebut bermasalah dan pemiliknya perlu memperbaikinya. Jika sekarang gagal dengan ERR_CONTENT_LENGTH_MISMATCH atau ERR_INCOMPLETE_CHUNKED_ENCODING, server memotong respons apa pun protokolnya. Tutup jendela itu setelah selesai; Chrome normal Anda tidak terpengaruh.
Untuk pemilik situs: mengatasi error protokol HTTP/2
Jika pengunjung di jaringan dan browser yang berbeda-beda melaporkan error ini, masalahnya ada di stack Anda. Tiga pemeriksaan berikut menemukan hampir semua penyebabnya.
1. Reproduksi dengan curl
# HTTP/2: watch the end of the output
curl -sv --http2 https://example.com/broken-page -o /dev/null
# A stream the server gave up on ends with something like:
# HTTP/2 stream 1 was not closed cleanly: INTERNAL_ERROR (err 2)
# (curl 8.19+: HTTP/2 stream 1 reset by server (error 0x2 INTERNAL_ERROR);
# "reset by curl" means curl rejected the response itself)
# Same URL over HTTP/1.1 for comparison
curl -sv --http1.1 https://example.com/broken-page -o /dev/nullJika HTTP/1.1 berhasil dan HTTP/2 gagal, HTTP/2 terlibat. "Reset by server" menunjukkan server atau sebuah proxy menyerah di tengah respons. curl tidak memeriksa persis apa yang diperiksa Chrome (curl menolak Content-Length yang tidak sesuai dan header koneksi yang diloloskan Chrome), jadi anggap ini petunjuk kuat, bukan bukti. Cek HTTP Header menampilkan header yang disetel aplikasi Anda jika dilihat dari luar jaringan Anda.
2. Periksa respons yang terpotong di tengah jalan
Penyebab paling umum di sisi server adalah respons yang sudah dimulai (status 200, header terkirim) lalu tidak bisa diselesaikan. nginx menampung respons besar dari aplikasi Anda ke dalam file sementara, dan jika disk penuh atau nginx tidak bisa menulis ke folder temp-nya, nginx mereset stream dan browser melaporkan error protokol. Periksa:
df -h # is any disk full?
sudo grep -E "No space left|Permission denied" /var/log/nginx/error.log | tail
ls -ld /var/lib/nginx/proxy /var/lib/nginx/fastcgi # Debian/Ubuntu packages
ls -ld /var/cache/nginx/proxy_temp /var/cache/nginx/fastcgi_temp # nginx.org packages
# the temp folders must be writable by the nginx worker userPeriksa juga aplikasinya: proses PHP atau Node yang crash, timeout, atau mencapai batas memori saat men-streaming halaman besar atau unduhan menghasilkan hal yang sama. Log aplikasi di sekitar waktu error biasanya memperlihatkannya.
3. Perbaiki Content-Length dan header terlarang
- Content-Length: biarkan server yang menghitungnya. Jangan menyetelnya secara manual di kode aplikasi jika ada plugin, middleware, atau web server yang juga mengompres atau mengubah output, karena panjang yang dideklarasikan tidak lagi sesuai dengan byte yang dikirim. Panjang yang disetel di kode PHP sementara plugin atau setelan PHP juga mengompres output adalah salah satu penyebabnya di situs WordPress.
- Transfer-Encoding: jangan pernah mengirimnya dalam respons HTTP/2; Chrome mereset stream saat melihatnya. RFC 9113 juga melarang
Connection,Keep-Alive,Proxy-Connection, danUpgrade. Chrome mengabaikannya, tetapi curl dan client ketat lain menolaknya, dan nginx membuang sebagian besar header itu dari respons yang diproksi untuk Anda. - Nilai header: pastikan tidak ada header yang berisi baris baru atau karakter kontrol. Masalah ini sering berasal dari input pengguna yang dimasukkan ke header, seperti nama file di
Content-Disposition. - CDN di depan: jika Anda memakai Cloudflare atau CDN lain, uji origin secara langsung (dengan curl
--resolveatau entri hosts) untuk mengetahui apakah error berasal dari origin atau dari CDN.
ERR_HTTP2_PROTOCOL_ERROR vs error serupa
| Error | Kode | Yang terjadi |
|---|---|---|
| ERR_HTTP2_PROTOCOL_ERROR | -337 | Respons HTTP/2 melanggar aturan protokol |
| ERR_QUIC_PROTOCOL_ERROR | -356 | Kegagalan sejenis di HTTP/3 (QUIC) |
| ERR_SSL_PROTOCOL_ERROR | -107 | Handshake HTTPS (TLS) gagal sebelum HTTP/2 dimulai |
| ERR_CONNECTION_CLOSED | -100 | Koneksi ditutup sebelum halaman tiba |
| ERR_EMPTY_RESPONSE | -324 | Server sama sekali tidak mengirim apa pun |
Panduan lengkapnya: ERR_QUIC_PROTOCOL_ERROR, ERR_SSL_PROTOCOL_ERROR, ERR_CONNECTION_CLOSED, dan ERR_EMPTY_RESPONSE. Untuk memeriksa sertifikat dan konfigurasi HTTPS sebuah situs dari luar, gunakan SSL Checker.
Lihat header yang benar-benar dikirim situs Anda
Cek HTTP Header dari DNS Robot mengambil URL mana pun dari server kami lewat HTTP/1.1 dan menampilkan kode status serta setiap header respons yang disetel aplikasi Anda (Content-Length, Content-Encoding, Content-Disposition), sehingga bisa Anda bandingkan dengan hasil curl --http2.
Sumber
- net_error_list.h (HTTP2_PROTOCOL_ERROR -337), Chromium
- RFC 9113: HTTP/2, malformed messages, IETF
- HTTP/2: ERR_HTTP2_PROTOCOL_ERROR, Cloudflare


