Saat ini saya sedang mengerjakan situs web, yang memicu net::ERR_HTTP2_PROTOCOL_ERROR 200
kesalahan di Google Chrome. Saya tidak yakin persis apa yang dapat memprovokasi kesalahan ini, saya hanya memperhatikan itu muncul hanya ketika mengakses situs web di HTTPS. Saya tidak bisa 100% yakin itu terkait, tetapi sepertinya itu mencegah javascript dieksekusi dengan benar.
Misalnya, skenario berikut terjadi:
Saya mengakses situs web dalam HTTPS
Umpan Twitter saya terintegrasi melalui https://publish.twitter.com tidak dimuat sama sekali
Saya dapat melihat ERR_HTTP2_PROTOCOL_ERROR di konsol
Jika saya menghapus kode untuk memuat umpan Twitter, kesalahan tetap ada
Jika saya mengakses situs web dalam HTTP, umpan Twitter muncul dan kesalahannya hilang
Google Chrome adalah satu-satunya peramban web yang memicu kesalahan: ini berfungsi dengan baik di Edge dan Firefox. (NB: Saya mencoba dengan Safari, dan saya memiliki kcferrordomaincfnetwork 303
kesalahan serupa )
Saya bertanya-tanya apakah itu bisa terkait dengan header yang dikembalikan oleh server karena ada '200' yang disebutkan dalam kesalahan, dan halaman 404/500 tidak memicu apa pun.
Masalahnya adalah kesalahan tidak didokumentasikan sama sekali. Pencarian Google memberi saya sangat sedikit hasil. Selain itu, saya perhatikan itu muncul pada rilis Google Chrome yang sangat baru; kesalahan tidak muncul pada v.64.X, tetapi itu terjadi pada v.75 + (terlepas dari OS; saya bekerja pada Mac tho).
Petunjuk apa pun pada titik ini untuk diselidiki akan dengan senang hati dihargai!
Terima kasih sebelumnya.
Tristan
Sunting 1: Mungkin terkait dengan Situs Web OK di Firefox tetapi tidak di Safari (kCFErrorDomainCFNetwork error 303) baik Chrome (net :: ERR_SPDY_PROTOCOL_ERROR)
Sunting 2: Temuan dari penyelidikan lebih lanjut adalah sebagai berikut:
- kesalahan tidak muncul pada halaman yang sama persis jika server mengembalikan 404 bukannya 2XX
- kesalahan tidak muncul di lokal dengan sertifikat HTTPS
- kesalahan muncul di server yang berbeda (keduanya milik OVH), yang menggunakan sertifikat yang berbeda
- kesalahan muncul tidak peduli apa versi PHP yang digunakan, dari 5,6 ke 7,3 (kerangka kerja yang digunakan: Cakephp 2.10)
Sunting 3: Seperti yang diminta, di bawah ini adalah header yang dikembalikan untuk sumber daya yang gagal, yang merupakan seluruh halaman web. Bahkan jika kesalahan memicu pada setiap halaman yang memiliki header HTTP 200, halaman-halaman itu selalu memuat pada browser klien, tetapi kadang-kadang ada elemen yang hilang (misalnya, umpan Twitter eksternal). Setiap aset lain pada tab Jaringan memiliki pengembalian yang berhasil, kecuali seluruh dokumen itu sendiri.
Header Google Chrome (dengan kesalahan):
Header Firefox (tanpa kesalahan):
Sebuah curl --head --http2
permintaan di konsol mengembalikan sukses berikut:
HTTP/2 200
date: Fri, 04 Oct 2019 08:04:51 GMT
content-type: text/html; charset=UTF-8
content-length: 127089
set-cookie: SERVERID31396=2341116; path=/; max-age=900
server: Apache
x-powered-by: PHP/7.2
set-cookie: xxxxx=0919c5563fc87d601ab99e2f85d4217d; expires=Fri, 04-Oct-2019 12:04:51 GMT; Max-Age=14400; path=/; secure; HttpOnly
vary: Accept-Encoding
Sunting 4: Mencoba masuk lebih dalam dengan chrome: // net-export / dan https://netlog-viewer.appspot.com alat memberi tahu saya bahwa permintaan diakhiri dengan RST_STREAM:
t=123354 [st=5170] HTTP2_SESSION_RECV_RST_STREAM
--> error_code = "2 (INTERNAL_ERROR)"
--> stream_id = 1
Untuk apa yang saya baca di pos lain ini , " Dalam HTTP / 2, jika klien ingin membatalkan permintaan, ia akan mengirim RST_STREAM. Ketika server menerima RST_STREAM, ia akan berhenti mengirim frame DATA ke klien, sehingga menghentikan respons (atau unduhan). Sambungan masih dapat digunakan untuk permintaan lain, dan permintaan / tanggapan yang bersamaan dengan yang telah dibatalkan dapat terus berlanjut. [...] Ada kemungkinan bahwa pada saat RST_STREAM melakukan perjalanan dari klien ke server, seluruh konten permintaan sedang dalam transit dan akan tiba ke klien, yang akan membuangnya. Namun, untuk konten respons besar, mengirim RST_STREAM mungkin memiliki peluang bagus untuk tiba ke server sebelum keseluruhan konten respons dikirim, dan karenanya akan menghemat bandwidth. "
Perilaku yang dijelaskan sama dengan yang saya amati. Tapi itu berarti browser adalah biang keladinya, dan kemudian saya tidak akan mengerti mengapa hal itu terjadi pada dua halaman yang identik dengan satu memiliki 200 header dan yang lainnya 404 (sama berlaku jika saya menonaktifkan JS).
sumber
Jawaban:
Selama beberapa minggu saya juga terganggu oleh "bug" ini:
Dalam kasus saya, ini terjadi pada gambar yang dihasilkan oleh PHP.
Itu pada
header()
level, dan yang satu ini khususnya:Jelas tidak mengembalikan ukuran yang tepat, jadi saya menghapusnya dan semuanya berfungsi dengan baik sekarang.
Jadi Chrome memeriksa keakuratan data yang dikirimkan melalui header, dan jika tidak sesuai, itu gagal.
EDIT
Saya menemukan mengapa
content-length
viafilesize
salah perhitungan:GZIP
kompresi aktif pada file PHP, jadi mengecualikan file yang dimaksud akan memperbaiki masalah. Masukkan kode ini di.htaccess
:Berhasil dan kami tetap header
Content-length
.sumber
Saya tidak tahu apa yang sebenarnya terjadi, tetapi saya menemukan solusi.
Fitur CDN dari OVH adalah biang keladinya. Saya telah menginstalnya pada layanan host saya tetapi dinonaktifkan untuk domain saya karena saya tidak membutuhkannya.
Entah bagaimana, ketika saya mengaktifkannya, semuanya berfungsi.
Saya pikir itu memaksa Apache untuk menggunakan protokol HTTP2, tetapi apa yang saya tidak mengerti adalah bahwa memang ada HTTP2 yang disebutkan di setiap header saya, yang saya anggap server menjawab dengan menggunakan protokol yang tepat.
Jadi solusi untuk kasus khusus saya adalah mengaktifkan opsi CDN pada semua domain yang bersangkutan.
Jika ada yang lebih memahami apa yang bisa terjadi di sini, jangan ragu untuk berbagi penjelasan.
sumber
Saya mengalami ini karena server http2 menutup koneksi ketika mengirim respons besar ke Chrome.
Mengapa? Karena itu hanya pengaturan server http2, bernama WriteTimeout .
sumber
Dalam kasus saya itu - tidak ada ruang disk yang tersisa di server web.
sumber
Saya mengalami masalah yang sama, saya mendapatkan ERR_HTTP2_PROTOCOL_ERROR pada salah satu permintaan GET HTTP.
Saya perhatikan bahwa pembaruan Chrome sedang tertunda, jadi saya memperbarui browser Chrome ke versi terbaru dan kesalahan hilang saat saya meluncurkan kembali browser tersebut.
sumber
Saya punya masalah ini ketika memiliki server Nginx yang mengekspos aplikasi node-js ke dunia eksternal. Nginx membuat file (css, js, ...) dikompresi dengan
gzip
dan dengan Chrome terlihat sama.Masalahnya terpecahkan ketika kami menemukan bahwa server node-js juga mengompresi konten dengan gzip. Di suatu tempat, kompresi ganda ini mengarah ke masalah ini. Membatalkan kompresi node-js menyelesaikan masalah.
sumber
Kesalahan ini sedang diperbaiki: https://chromium-review.googlesource.com/c/chromium/src/+/2001234
Tapi itu membantu saya, mengubah pengaturan nginx:
Dalam kasus saya, Nginx bertindak sebagai proxy terbalik untuk aplikasi Node.js.
sumber
Ini terjadi pada saya ketika saya mendaftarkan nama domain baru, misalnya, "baru" untuk example.com (new.example.com). Nama tidak dapat diselesaikan sementara di lokasi saya selama beberapa jam, sementara itu bisa diselesaikan di luar negeri. Jadi saya menggunakan proxy untuk menguji situs web tempat saya melihat
net::ERR_HTTP2_PROTOCOL_ERROR
di konsol chrome untuk beberapa posting AJAX. Berjam-jam kemudian, ketika nama itu bisa dibeli kembali secara lokal, kesalahan itu hilang begitu saja.Saya pikir alasan untuk kesalahan itu adalah permintaan AJAX itu tidak dialihkan oleh proxy saya, hanya mengunjungi situs web yang belum diselesaikan oleh resolver DNS lokal saya.
sumber
Saya menghadapi kesalahan ini beberapa kali dan, itu karena mentransfer sumber daya besar (lebih besar dari 3MB) dari server ke klien.
sumber
Saya mendapatkan masalah yang sama (asp, c # - HttpPostedFileBase) ketika memposting file yang lebih besar dari 1MB (meskipun aplikasi tidak memiliki batasan untuk ukuran file), bagi saya penyederhanaan kelas model membantu. Jika Anda mengalami masalah ini, cobalah untuk menghapus beberapa bagian dari model, dan lihat apakah itu akan membantu dengan cara apa pun. Kedengarannya aneh, tetapi berhasil untuk saya.
sumber
Saya telah mengalami masalah ini selama seminggu terakhir sekarang karena saya telah mencoba mengirim permintaan DELETE ke server PHP saya melalui AJAX. Saya baru-baru ini meningkatkan paket hosting saya di mana saya sekarang memiliki Sertifikat SSL di host saya yang menyimpan file PHP dan JS. Sejak menambahkan Sertifikat SSL saya tidak lagi mengalami masalah ini. Berharap ini membantu dengan kesalahan aneh ini.
sumber
Saya juga menghadapi kesalahan ini dan saya percaya ada beberapa alasan di baliknya. Milik saya, ARR sedang kehabisan waktu.
Dalam kasus saya, browser membuat permintaan ke situs proxy terbalik di mana saya telah menetapkan aturan redirection saya dan situs proxy itu akhirnya meminta situs yang sebenarnya. Sekarang untuk data besar dibutuhkan waktu lebih dari 2 menit 5 detik dan batas waktu Permintaan Aplikasi Routing untuk server saya ditetapkan menjadi 2 menit. Saya memperbaikinya dengan meningkatkan batas waktu ARR dengan langkah-langkah di bawah ini: 1. Pergi ke IIS 2. Klik pada nama server 3. Klik pada Cache Routing Permintaan Aplikasi di panel tengah 4. Klik pengaturan Server Proxy di panel kanan 5. Tingkatkan batas waktu 6 Klik Terapkan
sumber
Dalam kasus kami, alasannya adalah tajuk tidak valid. Seperti yang disebutkan dalam Edit 4:
Cari yang serupa:
sumber
Tim saya melihat ini pada satu file javascript yang kami sajikan. Setiap file lainnya berfungsi dengan baik. Kami beralih dari
http2
kembali kehttp1.1
dan kemudian salah satunet::ERR_INCOMPLETE_CHUNKED_ENCODING
atauERR_CONTENT_LENGTH_MISMATCH
. Kami akhirnya menemukan bahwa ada filter perusahaan (Trustwave) yang keliru mendeteksi "infoleak" (kami menduga itu mendeteksi sesuatu dalam file / nama file kami yang menyerupai nomor jaminan sosial). Mendapatkan perusahaan untuk mengubah filter ini menyelesaikan masalah kami.sumber
Kami mengalami masalah ini pada halaman dengan string Base64 yang panjang. Masalahnya terjadi karena kami menggunakan CloudFlare.
Detail: https://community.cloudflare.com/t/err-http2-protocol-error/119619 .
Bagian kunci dari pos forum:
Peretasan sementara adalah untuk menonaktifkan HTTP / 2 di CloudFlare.
Semoga orang lain dapat menghasilkan solusi yang lebih baik yang tidak memerlukan penonaktifan HTTP / 2 di CloudFlare.
sumber