Apa itu jaring :: ERR_HTTP2_PROTOCOL_ERROR tentang?

36

Saat ini saya sedang mengerjakan situs web, yang memicu net::ERR_HTTP2_PROTOCOL_ERROR 200kesalahan 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:

  1. Saya mengakses situs web dalam HTTPS

  2. Umpan Twitter saya terintegrasi melalui https://publish.twitter.com tidak dimuat sama sekali

  3. Saya dapat melihat ERR_HTTP2_PROTOCOL_ERROR di konsol

  4. Jika saya menghapus kode untuk memuat umpan Twitter, kesalahan tetap ada

  5. 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 303kesalahan 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. baris yang gagal di konsol

Header Google Chrome (dengan kesalahan):

Header Chrome

Header Firefox (tanpa kesalahan):

Header Firefox

Sebuah curl --head --http2permintaan 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).

Tristan G
sumber
aboutssl.org/fix-google-chrome-error-err_ssl_protocol_error itu satu dari 110 hasil -
Jaromanda X
Saya sudah di sini jelas, dan hanya ada jawaban terkait sisi klien, yang tidak bisa menjadi solusi.
Tristan G
apakah kesalahan terjadi pada browser non-chrome? jika tidak, bagaimana ini bukan masalah sisi klien (khususnya browser Chrum)?
Jaromanda X
1
Kemungkinan header respons HTTP salah. Apakah seluruh situs tidak dimuat? Atau hanya satu atau lebih aset? Bisakah Anda mengedit pertanyaan untuk menyertakan header respons HTTP yang diperlihatkan dalam respons http untuk aset yang tidak dimuat saat menggunakan HTTP / 2? Dan juga untuk Edge / Firefox tempat kerjanya?
Barry Pollard
1
Tidak dapat melihat sesuatu yang salah di sana jadi curiga itu bukan permintaan utama. Abaikan juga hal cookie - bukan itu. Coba ini untuk melihat apakah Anda dapat mengetahuinya: michalspacek.com/…
Barry Pollard

Jawaban:

7

Selama beberapa minggu saya juga terganggu oleh "bug" ini:

net :: ERR_HTTP2_PROTOCOL_ERROR 200

Dalam kasus saya, ini terjadi pada gambar yang dihasilkan oleh PHP.

Itu pada header()level, dan yang satu ini khususnya:

header ('Content-Length:'. Filesize($cache_file));

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-lengthvia filesizesalah perhitungan: GZIPkompresi aktif pada file PHP, jadi mengecualikan file yang dimaksud akan memperbaiki masalah. Masukkan kode ini di .htaccess:

SetEnvIfNoCase Request_URI ^ / thumb.php no-gzip -vary

Berhasil dan kami tetap header Content-length.

Xtendo
sumber
1
Hebat, Anda menyelamatkan saya !!! Tapi saya masih tidak mengerti masalah sebenarnya, dalam kasus saya kesalahan hanya terjadi di https tetapi tidak di http.
Nico
Halo @Nico, ya, saya pikir itu normal, verifikasi antara ukuran yang diumumkan dan file yang diunduh oleh browser (Chrome) hanya boleh dilakukan dalam protokol https. Sangat senang bahwa solusi ini dapat membantu Anda!
Xtendo
1
Entah bagaimana saya berhasil menggunakan "Konten-Panjang" alih-alih "Konten-Panjang". Setelah menghapus ruang, itu berhasil. Terima kasih.
Martin Lottering
Hello @Martin Lottering Sangat senang itu bekerja untuk Anda sekarang! :-)
Xtendo
6

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.

Tristan G
sumber
membersihkan cache cdn bekerja untuk saya
Varshaan
4

Saya mengalami ini karena server http2 menutup koneksi ketika mengirim respons besar ke Chrome.

Mengapa? Karena itu hanya pengaturan server http2, bernama WriteTimeout .

satu buku
sumber
4

Dalam kasus saya itu - tidak ada ruang disk yang tersisa di server web.

Alex Kalmikov
sumber
menarik, bagi saya yang sama, server web depan memiliki disk penuh. Sepertinya nginx tidak menangkap situasi ini karena tidak ada yang terlihat di log.
vchrizz
3

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.

Jaikumar
sumber
2

Saya punya masalah ini ketika memiliki server Nginx yang mengekspos aplikasi node-js ke dunia eksternal. Nginx membuat file (css, js, ...) dikompresi dengan gzipdan 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.

No1Lives4Ever
sumber
6
Sangat menarik untuk melihat bahwa beberapa orang telah menjawab posting ini, dan setiap kali akar masalahnya adalah sesuatu yang berbeda. Saya pikir kesalahan ini memang cukup membingungkan.
Tristan G
2

Kesalahan ini sedang diperbaiki: https://chromium-review.googlesource.com/c/chromium/src/+/2001234

Tapi itu membantu saya, mengubah pengaturan nginx:

  • menyalakan gzip;
  • add_header 'Kontrol-Cache' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age = 0';
  • habis masa berlakunya;

Dalam kasus saya, Nginx bertindak sebagai proxy terbalik untuk aplikasi Node.js.

EduardS
sumber
jawaban ini berhasil juga untuk saya. Ikuti tautan ini docs.nginx.com/nginx/admin-guide/web-server/compression untuk sintaksis yang tepat
Bhargavi Gopalachar
1

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_ERRORdi 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.

Dzhuang
sumber
1

Saya menghadapi kesalahan ini beberapa kali dan, itu karena mentransfer sumber daya besar (lebih besar dari 3MB) dari server ke klien.

Fereydoon Barikzehy
sumber
0

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.

LV
sumber
0

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.

Matthew Fallon
sumber
0

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

Ankit
sumber
0

Dalam kasus kami, alasannya adalah tajuk tidak valid. Seperti yang disebutkan dalam Edit 4:

  • ambil log
  • di pemirsa pilih Acara
  • pilih HTTP2_SESSION

Cari yang serupa:

HTTP2_SESSION_RECV_INVALID_HEADER

-> error = "Karakter tidak valid dalam nama header."

-> header_name = " charset = utf-8 "

Милан Енев
sumber
0

Tim saya melihat ini pada satu file javascript yang kami sajikan. Setiap file lainnya berfungsi dengan baik. Kami beralih dari http2kembali ke http1.1dan kemudian salah satu net::ERR_INCOMPLETE_CHUNKED_ENCODINGatau ERR_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.

adamdport
sumber
0

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:

Setelah pengujian lebih lanjut pada tab Penyamaran di beberapa browser, kemudian melakukan perubahan pada kode dari BASE64 ke gambar .png yang nyata, masalah tidak pernah terjadi lagi, di browser APA PUN. The .png memiliki sekitar 500kb sebelum menjadi base64, jadi CloudFlare memiliki masalah dengan garis besar teks pada baris yang sama (karena base64 adalah string yang panjang) sebagai proxy antara domain dan heroku. Seperti yang disebutkan sebelumnya, langsung mengenai Heroku url juga tidak pernah terjadi masalah.

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.

Crashalot
sumber