เน็ต :: ERR_HTTP2_PROTOCOL_ERROR เกี่ยวกับอะไร


36

ฉันกำลังทำงานกับเว็บไซต์ซึ่งก่อให้เกิดnet::ERR_HTTP2_PROTOCOL_ERROR 200ข้อผิดพลาดใน Google Chrome ฉันไม่แน่ใจว่าสิ่งใดที่สามารถกระตุ้นข้อผิดพลาดนี้ได้ฉันเพิ่งสังเกตว่ามันจะโผล่ออกมาเฉพาะเมื่อเข้าถึงเว็บไซต์ใน HTTPS ฉันไม่แน่ใจ 100% ว่าเกี่ยวข้องกัน แต่ดูเหมือนว่าจะป้องกันไม่ให้มีการเรียกใช้ JavaScript อย่างถูกต้อง

ตัวอย่างเช่นสถานการณ์ต่อไปนี้เกิดขึ้น:

  1. ฉันกำลังเข้าถึงเว็บไซต์ใน HTTPS

  2. ฟีด Twitter ของฉันรวม อยู่ในhttps://publish.twitter.comไม่ได้โหลดเลย

  3. ฉันสามารถสังเกตเห็นในคอนโซล ERR_HTTP2_PROTOCOL_ERROR

  4. หากฉันลบรหัสเพื่อโหลดฟีด Twitter ข้อผิดพลาดจะยังคงอยู่

  5. ถ้าฉันเข้าถึงเว็บไซต์ใน HTTP ฟีด Twitter จะปรากฏขึ้นและข้อผิดพลาดจะหายไป

Google Chrome เป็นเว็บเบราว์เซอร์เดียวที่ก่อให้เกิดข้อผิดพลาด: ทำงานได้ดีบน Edge และ Firefox (NB: ฉันลองกับ Safari และฉันมีเหมือนกันkcferrordomaincfnetwork 303ข้อผิดพลาดที่ )

ฉันสงสัยว่าอาจเกี่ยวข้องกับส่วนหัวที่ส่งคืนโดยเซิร์ฟเวอร์เนื่องจากมีการกล่าวถึงข้อผิดพลาด '200' หรือไม่และหน้า 404/500 ไม่ได้กระตุ้นอะไรเลย

สิ่งที่เป็นข้อผิดพลาดที่ไม่ได้บันทึกไว้เลย การค้นหาของ Google ให้ผลลัพธ์ที่น้อยมาก ยิ่งกว่านั้นฉันสังเกตเห็นว่ามันปรากฏใน Google Chrome รุ่นล่าสุด ข้อผิดพลาดจะไม่ปรากฏบน v.64.X แต่เกิดขึ้นใน v.75 + (ไม่ว่าจะใช้ระบบปฏิบัติการใดฉันกำลังใช้ Mac tho อยู่)

เบาะแสที่จุดนี้ในการตรวจสอบใด ๆ ที่จะได้รับการชื่นชมอย่างดีใจ!

ขอบคุณล่วงหน้า.

อุโมงค์


แก้ไข 1:อาจเกี่ยวข้องกับเว็บไซต์ OK บน Firefox แต่ไม่ใช่ใน Safari (kCFErrorDomainCFNetwork ข้อผิดพลาด 303) ทั้ง Chrome (สุทธิ :: ERR_SPDY_PROTOCOL_ERROR)


แก้ไข 2:ข้อค้นพบจากการสืบสวนเพิ่มเติมมีดังนี้:

  • ข้อผิดพลาดจะไม่ปรากฏในหน้าเดียวกันถ้าเซิร์ฟเวอร์ส่งคืน 404 แทนที่จะเป็น 2XX
  • ข้อผิดพลาดจะไม่ปรากฏในท้องถิ่นด้วยใบรับรอง HTTPS
  • ข้อผิดพลาดปรากฏขึ้นบนเซิร์ฟเวอร์ที่แตกต่างกัน (ทั้งสองเป็น OVH) ซึ่งใช้ใบรับรองที่แตกต่างกัน
  • ข้อผิดพลาดปรากฏไม่ว่าจะใช้ PHP เวอร์ชันใดจาก 5.6 ถึง 7.3 (เฟรมเวิร์กที่ใช้: Cakephp 2.10)

แก้ไข 3:ตามที่ร้องขอด้านล่างเป็นส่วนหัวที่ส่งคืนสำหรับแหล่งทรัพยากรที่ล้มเหลวซึ่งเป็นหน้าเว็บทั้งหมด แม้ว่าข้อผิดพลาดจะเกิดขึ้นในแต่ละหน้ามีส่วนหัว HTTP 200 หน้าเหล่านั้นมักจะโหลดบนเบราว์เซอร์ของลูกค้า แต่บางครั้งองค์ประกอบขาดหายไป (ในตัวอย่างของฉันฟีด Twitter ภายนอก) เนื้อหาอื่น ๆ ทั้งหมดในแท็บเครือข่ายมีผลตอบแทนที่ประสบความสำเร็จยกเว้นเอกสารทั้งหมดเอง บรรทัดที่ล้มเหลวในคอนโซล

ส่วนหัวของ Google Chrome (มีข้อผิดพลาด):

ส่วนหัวของ Chrome

ส่วนหัวของ Firefox (ไม่มีข้อผิดพลาด):

ส่วนหัวของ Firefox

curl --head --http2คำขอในคอนโซลกลับประสบความสำเร็จต่อไปนี้:

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

แก้ไข 4: การพยายามเจาะลึกลงไปกับ chrome: // net-export / และhttps://netlog-viewer.appspot.comเครื่องมือบอกให้ฉันทราบว่าคำขอจบลงด้วย RST_STREAM:

t=123354 [st=5170]    HTTP2_SESSION_RECV_RST_STREAM
                      --> error_code = "2 (INTERNAL_ERROR)"
                      --> stream_id = 1

สำหรับสิ่งที่ฉันอ่านในโพสต์อื่นนี้ " ใน HTTP / 2 ถ้าลูกค้าต้องการยกเลิกคำขอก็จะส่ง RST_STREAM เมื่อเซิร์ฟเวอร์ได้รับ RST_STREAM มันจะหยุดส่งเฟรมข้อมูลไปยังลูกค้าดังนั้นการหยุดการตอบสนอง (หรือดาวน์โหลด) การเชื่อมต่อยังคงสามารถใช้งานได้สำหรับคำขออื่น ๆ และคำขอ / การตอบกลับที่เกิดขึ้นพร้อมกันกับคำขอที่ถูกยกเลิกอาจดำเนินการต่อไปได้ [... ] เป็นไปได้ว่าเมื่อถึงเวลาที่ RST_STREAM เดินทางจาก ไคลเอนต์ไปยังเซิร์ฟเวอร์เนื้อหาทั้งหมดของการร้องขออยู่ในระหว่างการขนส่งและจะมาถึงลูกค้าซึ่งจะละทิ้งมันอย่างไรก็ตามสำหรับเนื้อหาการตอบสนองขนาดใหญ่การส่ง RST_STREAM อาจมีโอกาสที่ดีที่จะมาถึงเซิร์ฟเวอร์ก่อนที่จะทั้งหมด เนื้อหาการตอบสนองถูกส่งและดังนั้นจะประหยัดแบนด์วิดท์ "

พฤติกรรมที่อธิบายนั้นเหมือนกับที่ฉันสังเกตได้ แต่นั่นหมายความว่าเบราว์เซอร์เป็นผู้ร้ายและจากนั้นฉันจะไม่เข้าใจว่าทำไมมันจึงเกิดขึ้นในสองหน้าเหมือนกันโดยที่หนึ่งมี 200 ส่วนหัวและอีก 404 (เหมือนกันถ้าฉันปิดการใช้งาน JS)



ฉันเคยมาที่นี่และมีเพียงคำตอบที่เกี่ยวข้องกับลูกค้าซึ่งไม่สามารถแก้ไขได้
Tristan G

ข้อผิดพลาดเกิดขึ้นในเบราว์เซอร์ที่ไม่ใช่โครเมี่ยม? ถ้าไม่เป็นเช่นนั้นปัญหาด้านลูกค้า (เฉพาะเบราว์เซอร์ Chrum) เป็นอย่างไร
Jaromanda X

1
น่าจะเป็นส่วนหัวการตอบสนอง HTTP ที่ไม่ถูกต้อง ไซต์ทั้งหมดไม่โหลดหรือไม่ หรือเพียงแค่สินทรัพย์อย่างน้อยหนึ่งรายการ? คุณสามารถแก้ไขคำถามเพื่อรวมส่วนหัวการตอบกลับ HTTP ที่แสดงในการตอบกลับ http สำหรับเนื้อหาที่ไม่โหลดเมื่อใช้ HTTP / 2 ได้หรือไม่ และยังใช้กับ Edge / Firefox ได้ด้วย?
Barry Pollard

1
ไม่เห็นสิ่งผิดปกติดังนั้นจึงสงสัยว่าไม่ใช่คำขอหลัก ยังเพิกเฉยต่อสิ่งที่เป็นคุกกี้ด้วย - ไม่ใช่อย่างนั้น ลองใช้วิธีนี้ดูว่าคุณสามารถคิดออกได้ไหม
Barry Pollard

คำตอบ:


7

เป็นเวลาหลายสัปดาห์ที่ฉันรู้สึกรำคาญกับ "บั๊ก" นี้:

net :: ERR_HTTP2_PROTOCOL_ERROR 200

ในกรณีของฉันมันเกิดขึ้นกับภาพที่สร้างโดย PHP

มันอยู่ในheader()ระดับและโดยเฉพาะอย่างยิ่งในนี้:

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

เห็นได้ชัดว่าไม่ได้ส่งคืนขนาดที่แน่นอนดังนั้นฉันจึงลบและทุกอย่างทำงานได้ดีในขณะนี้

ดังนั้น Chrome จะตรวจสอบความถูกต้องของข้อมูลที่ส่งผ่านส่วนหัวและหากไม่สอดคล้องกันก็จะล้มเหลว

แก้ไข

ฉันพบว่าทำไมcontent-lengthผ่านทางfilesizeกำลังคำนวณผิด: การGZIPบีบอัดมีการใช้งานในไฟล์ PHP ดังนั้นการยกเว้นไฟล์ที่เป็นปัญหาจะแก้ไขปัญหา ใส่รหัสนี้ใน.htaccess:

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

Content-lengthมันทำงานได้และเราให้ส่วนหัว


1
ที่ดีที่คุณช่วยฉัน !!! แต่ฉันยังไม่เข้าใจปัญหาที่แท้จริงในกรณีของฉันข้อผิดพลาดเกิดขึ้นใน https แต่ไม่ใช่ใน http
Nico

สวัสดี @ นิโก้ใช่ฉันคิดว่ามันเป็นเรื่องปกติการยืนยันระหว่างขนาดที่ประกาศและของไฟล์ที่ดาวน์โหลดโดยเบราว์เซอร์ (Chrome) ควรจะทำในโปรโตคอล https เท่านั้น มีความสุขมากที่โซลูชันนี้สามารถช่วยคุณได้!
Xtendo

1
อย่างใดฉันจัดการเพื่อใช้ "เนื้อหา - ความยาว" แทน "ความยาวเนื้อหา" หลังจากลบพื้นที่แล้วก็ใช้งานได้ ขอบคุณ.
Martin Lottering

สวัสดี @ มาร์ตินลอตเตอรีดีใจมากสำหรับคุณตอนนี้! :-)
Xtendo

6

ฉันไม่ได้คิดออกว่าเกิดอะไรขึ้น แต่ฉันพบวิธีแก้ปัญหา

คุณลักษณะ CDN ของ OVHเป็นผู้กระทำความผิด ฉันติดตั้งลงในบริการโฮสต์ของฉันแล้ว แต่ปิดใช้งานสำหรับโดเมนของฉันเพราะฉันไม่ต้องการ

อย่างใดเมื่อฉันเปิดใช้งานทุกอย่างทำงาน

ฉันคิดว่ามันบังคับให้ Apache ใช้โปรโตคอล HTTP2 แต่สิ่งที่ฉันไม่เข้าใจก็คือมีการพูดถึง HTTP2 ในส่วนหัวของฉันซึ่งฉันเข้าใจว่าเซิร์ฟเวอร์ตอบรับโดยใช้โปรโตคอลที่ถูกต้อง

ดังนั้นทางออกสำหรับกรณีเฉพาะของฉันคือการเปิดใช้งานตัวเลือก CDN ในโดเมนที่เกี่ยวข้องทั้งหมด

หากใครเข้าใจดีกว่าว่าเกิดอะไรขึ้นที่นี่อย่าลังเลที่จะแบ่งปันคำอธิบาย


กวาดล้าง cdn cache ทำงานให้ฉัน
Varshaan

4

ฉันพบสิ่งนี้เพราะเซิร์ฟเวอร์ http2 ปิดการเชื่อมต่อเมื่อส่งการตอบกลับอย่างมากไปยัง Chrome

ทำไม? เพราะมันเป็นเพียงแค่การตั้งค่าเซิร์ฟเวอร์ http2 ที่ชื่อWriteTimeout


4

ในกรณีของฉันมันเป็น - ไม่มีพื้นที่ว่างบนดิสก์บนเว็บเซิร์ฟเวอร์


ที่น่าสนใจสำหรับฉันเหมือนกันเว็บเซิร์ฟเวอร์ด้านหน้ามีดิสก์เต็ม ดูเหมือนว่า nginx ไม่ทันสถานการณ์นี้เพราะไม่มีอะไรที่น่าสังเกตในบันทึก
vchrizz

3

ฉันพบปัญหาที่คล้ายกันฉันได้รับ ERR_HTTP2_PROTOCOL_ERROR จากหนึ่งในคำขอ HTTP GET

ฉันสังเกตเห็นว่าการอัปเดตของ Chrome อยู่ในระหว่างรอดังนั้นฉันจึงอัปเดตเบราว์เซอร์ Chrome เป็นเวอร์ชันล่าสุดและข้อผิดพลาดจะหายไปในครั้งต่อไปเมื่อฉันเปิดเบราว์เซอร์ใหม่


2

ฉันมีปัญหานี้เมื่อมีเซิร์ฟเวอร์ Nginx ที่เปิดเผยแอปพลิเคชัน node-js สู่โลกภายนอก Nginx สร้างไฟล์ (css, js, ... ) ที่ถูกบีบอัดด้วยgzipและด้วย Chrome ดูเหมือนว่าจะเหมือนกัน

ปัญหาได้รับการแก้ไขเมื่อเราพบว่าเซิร์ฟเวอร์ node-js ถูกบีบอัดเนื้อหาด้วย gzip ในบางครั้งการบีบอัดสองครั้งนี้นำไปสู่ปัญหานี้ การยกเลิกการบีบอัด node-js แก้ไขปัญหาได้


6
เป็นที่น่าสนใจที่จะเห็นว่ามีหลายคนตอบกระทู้นี้แล้วและทุกครั้งที่รากของปัญหาแตกต่างกัน ฉันคิดว่าข้อผิดพลาดนี้ค่อนข้างสับสนแน่นอน
Tristan G

2

ข้อผิดพลาดนี้กำลังได้รับการแก้ไข: https://chromium-review.googlesource.com/c/chromium/src/+/2001234

แต่มันช่วยฉันได้ด้วยการเปลี่ยนการตั้งค่า nginx:

  • เปิด gzip;
  • add_header 'Cache-Control' 'ไม่มีร้านค้า, แคช, ต้องตรวจสอบความถูกต้อง, ตรวจสอบ proxy-revalidate, max-age = 0';
  • หมดอายุออก;

ในกรณีของฉัน Nginx ทำหน้าที่เป็น reverse proxy สำหรับแอ็พพลิเคชัน Node.js


คำตอบนี้ใช้ได้สำหรับฉันด้วย ติดตามลิงค์นี้docs.nginx.com/nginx/admin-guide/web-server/compressionเพื่อหาไวยากรณ์ที่เหมาะสม
Bhargavi Gopalachar

1

สิ่งนี้เกิดขึ้นกับฉันเมื่อฉันลงทะเบียนชื่อโดเมนใหม่เช่น "ใหม่" สำหรับ example.com (new.example.com) ชื่อไม่สามารถแก้ไขได้ชั่วคราวในสถานที่ของฉันเป็นเวลาสองสามชั่วโมงในขณะที่สามารถแก้ไขได้ในต่างประเทศ ดังนั้นฉันจึงใช้พรอกซีเพื่อทดสอบเว็บไซต์ที่ฉันเห็นnet::ERR_HTTP2_PROTOCOL_ERRORในคอนโซล Chrome สำหรับโพสต์ AJAX ชั่วโมงต่อมาเมื่อชื่อ resloved ในท้องถิ่นข้อผิดพลาดเหล่านั้นก็หายไป

ฉันคิดว่าสาเหตุของข้อผิดพลาดนั้นคือคำขอ AJAX เหล่านั้นไม่ได้เปลี่ยนเส้นทางโดยพร็อกซีของฉันเพียงแค่เยี่ยมชมเว็บไซต์ที่ไม่ได้รับการแก้ไขโดยตัวแก้ไข DNS ในเครื่องของฉัน


1

ฉันประสบข้อผิดพลาดนี้หลายครั้งและเป็นเพราะการถ่ายโอนทรัพยากรขนาดใหญ่ (ใหญ่กว่า 3MB) จากเซิร์ฟเวอร์ไปยังไคลเอนต์


0

ฉันได้รับปัญหาเดียวกัน (asp, c # - HttpPostedFileBase) เมื่อโพสต์ไฟล์ที่มีขนาดใหญ่กว่า 1MB (แม้ว่าแอปพลิเคชันจะไม่มีข้อ จำกัด ด้านขนาดไฟล์) สำหรับฉันการทำให้ง่ายขึ้นของคลาสโมเดลช่วย หากคุณพบปัญหานี้ให้ลองลบบางส่วนของโมเดลออกและดูว่าจะช่วยได้หรือไม่ ฟังดูแปลก แต่ใช้งานได้สำหรับฉัน


0

ฉันพบปัญหานี้เมื่อสัปดาห์ที่แล้วเนื่องจากฉันพยายามส่งคำขอ DELETE ไปยังเซิร์ฟเวอร์ PHP ของฉันผ่าน AJAX ฉันเพิ่งอัพเกรดแผนโฮสต์ของฉันที่ฉันมีใบรับรอง SSL บนโฮสต์ของฉันซึ่งเก็บไฟล์ PHP และ JS ตั้งแต่เพิ่มใบรับรอง SSL ฉันไม่พบปัญหานี้อีกต่อไป หวังว่าสิ่งนี้จะช่วยให้มีข้อผิดพลาดที่แปลกประหลาดนี้


0

ฉันยังประสบข้อผิดพลาดนี้และฉันเชื่อว่าอาจมีสาเหตุหลายประการที่อยู่เบื้องหลัง ของฉันคือ ARR หมดเวลาแล้ว

ในกรณีของฉันเบราว์เซอร์กำลังร้องขอไปยังไซต์พร็อกซีย้อนกลับซึ่งฉันได้ตั้งกฎการเปลี่ยนเส้นทางของฉันและในที่สุดไซต์พร็อกซีนั้นก็ขอเว็บไซต์จริง ตอนนี้สำหรับข้อมูลขนาดใหญ่มันใช้เวลามากกว่า 2 นาที 5 วินาทีและหมดเวลาคำขอการกำหนดเส้นทางแอปพลิเคชันสำหรับเซิร์ฟเวอร์ของฉันตั้งไว้ที่ 2 นาที ฉันแก้ไขปัญหานี้โดยการเพิ่มการหมดเวลา ARR โดยขั้นตอนด้านล่าง: 1. ไปที่ IIS 2. คลิกที่ชื่อเซิร์ฟเวอร์ 3. คลิกที่แอปพลิเคชันการกำหนดเส้นทางแคชในบานหน้าต่างกลาง 4. คลิกการตั้งค่าพร็อกซีเซิร์ฟเวอร์ในบานหน้าต่างด้านขวา 5. เพิ่มการหมดเวลา 6 คลิกนำไปใช้


0

ในกรณีของเราสาเหตุส่วนหัวไม่ถูกต้อง ตามที่กล่าวไว้ในแก้ไข 4:

  • จดบันทึก
  • ในมุมมองให้เลือกกิจกรรม
  • เลือกHTTP2_SESSION

มองหาสิ่งที่คล้ายกัน:

HTTP2_SESSION_RECV_INVALID_HEADER

-> error = "อักขระไม่ถูกต้องในชื่อส่วนหัว"

-> header_name = " charset = utf-8 "


0

ทีมของฉันเห็นสิ่งนี้ในไฟล์ javascript เดียวที่เราให้บริการ ไฟล์อื่นทุกไฟล์ทำงานได้ดี เราเปลี่ยนจากการhttp2กลับไปhttp1.1แล้วอย่างใดอย่างหนึ่งหรือnet::ERR_INCOMPLETE_CHUNKED_ENCODING ERR_CONTENT_LENGTH_MISMATCHในที่สุดเราค้นพบว่ามีตัวกรององค์กร (Trustwave) ที่ตรวจจับ "infoleak" อย่างผิดพลาด (เราสงสัยว่าตรวจพบบางสิ่งในไฟล์ / ชื่อไฟล์ของเราที่คล้ายกับหมายเลขประกันสังคม) การทำให้องค์กรปรับแต่งตัวกรองนี้แก้ไขปัญหาของเราได้


0

เราประสบปัญหานี้ในหน้าเว็บที่มีสตริง Base64 ยาว ปัญหาเกิดขึ้นเพราะเราใช้ CloudFlare

รายละเอียด: https://community.cloudflare.com/t/err-http2-protocol-error/119619

ส่วนสำคัญจากโพสต์ฟอรัม:

หลังจากการทดสอบเพิ่มเติมเกี่ยวกับแท็บไม่ระบุตัวตนในหลายเบราว์เซอร์จากนั้นทำการเปลี่ยนแปลงโค้ดจาก BASE64 เป็นรูปภาพ. png จริงปัญหานี้ไม่เคยเกิดขึ้นอีกในเบราว์เซอร์ใด ๆ .png มีประมาณ 500kb ก่อนที่จะกลายเป็น base64 ดังนั้น CloudFlare จึงมีปัญหากับข้อความจำนวนมากในบรรทัดเดียวกัน (เนื่องจาก base64 เป็นสตริงยาว) เป็นพร็อกซีระหว่างโดเมนและ heroku ดังที่ได้กล่าวไว้ก่อนหน้าการกดปุ่ม URL ของ Heroku โดยตรงก็ไม่เคยเกิดขึ้น

แฮ็คชั่วคราวเป็นการปิดใช้งาน HTTP / 2 บน CloudFlare

หวังว่าคนอื่นสามารถสร้างทางออกที่ดีกว่าซึ่งไม่ต้องปิดการใช้งาน HTTP / 2 บน CloudFlare

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.